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 ランタイムを使用しています。
前もって感謝します。