2014-03-06 64 views
1

我有一個表達式ANTLR3擴大令牌選擇運營商

num_addition 
    : num_multi ((plus^|minus^) num_multi)* 
    ; 

我想令牌「加」和「減」更改爲不同的令牌所以我試圖使這個重寫規則。

num_addition 
    : num_multi (plus num_multi)* -> ^(num_multi ^(plus_special num_multi)*) 
    | num_multi (minus num_multi)* -> ^(num_multi ^(minus_special num_multi)*) 
    ; 

如果我這樣做,ANTLRWORKS中的世代似乎需要更長的時間,但它會生成正確的語法和令牌。如果我將這種風格應用於其他規則,例如「多重」,「分割」和「均等」等,它最終會達到ANTLRWORKS在按「生成」時不會執行任何操作的程度。

根據ANTLRWORKS沒有錯誤,但是當我生成什麼都沒有發生。

我錯誤地改寫了我想達到的目標嗎?

回答

2

您不能只將任何生產或終端注入到您的AST中,而這些生產或終端在您爲AST創建的解析器規則中不匹配。在你的情況下,你可以插入plusminus,因爲它們與解析器規則相匹配,但是不能插入plus_specialminus_special,因爲它們與解析器規則num_addition不匹配。

可以雖然注入虛構令牌。

嘗試這樣:

grammar T; 

tokens { 
    // Some imaginary tokens: 
    PLUS_SPECIAL; 
    MINUS_SPECIAL; 
} 

// ... 

num_addition 
: (a=num_multi -> $a) (PLUS b=num_multi -> ^(PLUS_SPECIAL $num_addition $b) 
         | MINUS b=num_multi -> ^(MINUS_SPECIAL $num_addition $b) 
         )* 
; 

// ... 

PLUS : '+'; 
MINUS : '-'; 
+0

我希望你也可以插入正常令牌(PLUS,而不是PLUS_SPECIAL)。但是對於任意製作你是對的。 –

+0

@MikeLischke,是的,只要它們在生產環境中匹配,就可以插入普通標記(或生產中的AST):不能在要創建AST的生產內插入不匹配的普通標記。我將重新解釋我的答案。 –

+0

偉大的答案。正是我在找什麼!語法生成,但肯定會變慢。 – meriley