奇怪" NoViableAltException"在带有虚构标记的树语法中

时间:2016-11-18 12:40:55

标签: tree antlr antlr3 tree-grammar

当我编译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。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我很惊讶root操作符可以应用于块。它实际上只对单个标记有意义,因为它将此标记标记为树的根。另外,为什么要多次复制MATCH_STATEMENT虚拟标记?这完全是多余的。你可以轻松地写:

keyword_controls_sub:
    MATCH_STATEMENT^ expression+
;

并将所有表达式作为子节点放在单个MATCH_STATEMENT根节点下。

并注意:现在有一个针对ANTLR4的C ++目标。 ANTLR3已经过时了,所以也许你应该考虑升级。