0
當我編譯我的樹語法時,我無法理解「NoViableAltException」異常。奇怪的「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([email protected][])
error 100: syntax error: assign.types: NoViableAltException([email protected][])
node from line 2482:10 no viable alternative at input '+'
error 100: syntax error: buildnfa: NoViableAltException([email protected][])
error 100: syntax error: codegen: NoViableAltException([email protected][])
error 100: syntax error: antlr.print: NoViableAltException([email protected][])
error 100: syntax error: antlr.print: NoViableAltException([email protected][])
如果我變樹語法:
keyword_controls_sub
: ^(MATCH_STATEMENT expression+)
;
有沒有編譯器錯誤,但我認爲這是不正確的,因爲在這種情況下,就只有一個MATCH_STATEMENT塊。
注意:我正在使用ANTLR3 C Runtime。
在此先感謝。
有兩種方法可以在ANTLR 3中編寫樹重寫 - 「^(node1 ...)」語法意味着括號中的第一個節點是父節點,所有其他節點都是子節點。它甚至可以像'^(level1 ^(level2 level3 level3)level2)'嵌套。這是你想知道的嗎? –
是的,我知道,但'keyword_controls_sub'的代碼沒有重寫操作符,因此^(...)就像一個塊一樣。不知道這是甚至有效的ANTLR語法。 –
我從來沒有使用樹語法,所以我只能基於重寫規則語法來猜測。也許OP試圖使用重寫,但得到的語法錯誤,ANTLR將其解釋爲根操作符? –