0

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 ブロックが 1 つしかないため、正しくないと思います。

注: ANTLR3 C ランタイムを使用しています。

前もって感謝します。

4

1 に答える 1