在我的代码中:
andexpr : orexpr (AND orexpr)*;
orexpr : atomicExpression ( OR atomicExpression)*;
atomicExpression :
attribute //THIS
| equalsExpression
| notEqualsExpression;
equalsExpression: attribute eq (value | arrayValue);
notEqualsExpression: attribute neq (value | arrayValue);
我想使THIS
规则抛出异常并且无效。
我希望它被包含为“有效”以在解析树时创建额外的上下文。我只输入attribute
。
有可能吗?
答案 0 :(得分:0)
使用您的代码:
atomicExpression :
attribute {if(true) {System.out.println("error");throw new RuntimeException();}}
| equalsExpression
| notEqualsExpression;
错误
调用org.antlr.v4.gui.TestRig.main(args)的问题
我做了一个快速测试,似乎ANTLR v4.5.3的TestRig捕获了RuntimeException本身。所以它只是打印一条语句,说调用TestRig.mains(args)时遇到问题而没有通常在异常后遇到的堆栈跟踪。所以我建议你在抛出异常之前添加一些有意义的东西。
if(true)
是必要的,以防止java编译器抱怨无法访问的语句,因为它足够聪明,知道RuntimeException()
终止程序,但在异常子句之后肯定会有一些代码由ANTLR生成。
请参阅我之前的问题: How To Terminate a Lexer in ANTLR4