antlr4如何使规则抛出异常

时间:2016-05-06 12:40:47

标签: antlr antlr4

在我的代码中:

     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。 有可能吗?

1 个答案:

答案 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