2010-06-11 22 views
0

由於問及Removing Left Recursion in ANTLR回答,我可以刪除左遞歸獲取樹的構建與ANTLR

 
E -> E + T|T 
T -> T * F|F 
F -> INT | (E) 

,我得到下面的一個

 
E -> TE' 
E' -> null | + TE' 
T -> FT' 
T' -> null | * FT' 

然後左遞歸中取出後,如何使修改語法的樹構造? 隨着輸入1 + 2,我想有一棵樹

^('+' ^(INT 1) ^(INT 2))
。或類似。

 
grammar T; 

options { 
    output=AST; 
    language=Python; 
    ASTLabelType=CommonTree; 
} 

start : e -> e 
    ; 
e : t ep -> ??? 
    ; 
ep : 
    | '+' t ep -> ??? 
    ; 
t : f tp -> ??? 
    ; 
tp : 
    | '*' f tp -> ??? 
    ; 
f : INT 
    | '(' e ')' -> e 
    ; 

INT : '0'..'9'+ ; 
WS: (' '|'\n'|'\r')+ {$channel=HIDDEN;} ; 
+0

我發佈了一個使用AST重寫規則的例子:http://stackoverflow.com/questions/2856612/visualizing-an-ast-created-with-antlr-in-a-net-environment。這有幫助嗎? – 2010-06-11 19:29:08

回答

2

意見了一下:儘管它有時可以從一個LR語法去一個LL語法,因爲你已經做了,結果不地道,並可能看起來像一個奇怪的方式來定義你的語法給熟悉LL語法的人。

例如,從上面考慮以下摘錄:

tp : 
    | '*' f tp -> ??? 

上面接受*後跟f,其第一組將包含INT(,本身的開始作爲其右遞歸的。因此,你永遠不會看到你想要在*上植入的表達式的開始,這會使它比構建你想要的樹要困難得多。

爲了方便在ANTLR中創建AST,您希望同時具有操作數和操作符。

add: 
    INT '+'^ INT; 

插入符號,^使得+樹的根和兩個INT小號成爲它的孩子。

的例子巴特ķlinked to是如何,我希望看到它與LL語法做了很大的例如 ...它擴展到支持不同優先級的運營商。