2013-08-29 86 views
1

的,我有以下規則:ANTLR:返回總是相同數量的兒童

statement : TOKEN1 opt1=TOKEN2? opt2=TOKEN3 TOKEN4 -> ^(TOKEN1 opt1? opt2); 

此規則將產生有一個或兩個孩子(取決於如果 OPT1定義與否)的AST。

我需要總是有固定數量的孩子(在這種情況下是2)。我知道,這 可以通過執行以下(UNDEFINED是一個假想的令牌)來實現:

statement : TOKEN1 opt1=TOKEN2 TOKEN4 -> ^(TOKEN1 opt1 UNDEFINED) 

      | TOKEN1 opt1=TOKEN2 opt2=TOKEN3 TOKEN4 -> ^(TOKEN1 opt1 opt2); 

這是罰款只是一個可選的令牌。問題是當我有更高的 數量的可選令牌。必須編寫許多規則才能捕獲所有可能的組合。這個問題如何以優雅的方式解決?

我正在使用ANTLR 3.4/C目標。

感謝,

T.

回答

0

你可以這樣做:

grammar G; 

tokens { 
    CHILD1; 
    CHILD2; 
    CHILD3; 
} 

... 

statement 
: ROOT t2=TOKEN2? t3=TOKEN3? t4=TOKEN4? 
    -> ^(ROOT ^(CHILD1 $t2?) ^(CHILD2 $t3?) ^(CHILD3 $t4?)) 
; 

這將導致AST總是有3個節點(這可能會或可能不會有一個標記爲孩子他們自己)。