当我编译Tree语法时,我无法理解" NoViableAltException"异常。
这是我的语法的一小部分,其规则给我带来了问题:
keyword_controls_sub
: expression (MB_COMA expression)* -> ^(MATCH_STATEMENT expression)+
;
生成如下树:
+-----------------+
| |
| ROOT |
| |
+-----------------+
|
|
+-------------------------------------+
| | |
+------------------+ +-----------------+ +-----------------+
| | | | | |
| MATCH_STATEMENT | | MATCH_STATEMENT | | MATCH_STATEMENT |
| | | | | |
+------------------+ +-----------------+ +-----------------+
| | |
+-------------------+ +-----------------+ +-----------------+
| | | | | |
| expression | | expression | | expression |
| | | | | |
+-------------------+ +-----------------+ +-----------------+
我的TreeGrammar中导致异常的规则:
keyword_controls_sub
: ^(MATCH_STATEMENT expression)+
;
具体来说,ANTLR编译器返回以下错误:
error 100: syntax error: antlr: NoViableAltException(79@[])
error 100: syntax error: assign.types: NoViableAltException(0@[])
node from line 2482:10 no viable alternative at input '+'
error 100: syntax error: buildnfa: NoViableAltException(0@[])
error 100: syntax error: codegen: NoViableAltException(0@[])
error 100: syntax error: antlr.print: NoViableAltException(0@[])
error 100: syntax error: antlr.print: NoViableAltException(0@[])
如果我将树语法更改为:
keyword_controls_sub
: ^(MATCH_STATEMENT expression+)
;
没有编译器错误,但我认为它不正确,因为在这种情况下只会有一个MATCH_STATEMENT块。
注意:我使用的是ANTLR3 C Runtime。
提前致谢。
答案 0 :(得分:0)
我很惊讶root操作符可以应用于块。它实际上只对单个标记有意义,因为它将此标记标记为树的根。另外,为什么要多次复制MATCH_STATEMENT虚拟标记?这完全是多余的。你可以轻松地写:
keyword_controls_sub:
MATCH_STATEMENT^ expression+
;
并将所有表达式作为子节点放在单个MATCH_STATEMENT根节点下。
并注意:现在有一个针对ANTLR4的C ++目标。 ANTLR3已经过时了,所以也许你应该考虑升级。