2016-11-18 20 views
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。

在此先感謝。

回答

0

我很驚訝根操作符可以應用到一個塊。它實際上只對單個標記有意義,因爲它將該標記標記爲樹的根。另外,您爲什麼要多次複製MATCH_STATEMENT虛擬標記?這完全是多餘的。你可以很容易地寫出:

keyword_controls_sub: 
    MATCH_STATEMENT^ expression+ 
; 

並且在單個MATCH_STATEMENT根節點下獲得所有表達式作爲子元素。

另外還有一個提示:現在有一個ANTLR4的C++目標。 ANTLR3已經過時了,所以也許你應該考慮升級。

+0

有兩種方法可以在ANTLR 3中編寫樹重寫 - 「^(node1 ...)」語法意味着括號中的第一個節點是父節點,所有其他節點都是子節點。它甚至可以像'^(level1 ^(level2 level3 level3)level2)'嵌套。這是你想知道的嗎? –

+0

是的,我知道,但'keyword_controls_sub'的代碼沒有重寫操作符,因此^(...)就像一個塊一樣。不知道這是甚至有效的ANTLR語法。 –

+0

我從來沒有使用樹語法,所以我只能基於重寫規則語法來猜測。也許OP試圖使用重寫,但得到的語法錯誤,ANTLR將其解釋爲根操作符? –