2012-06-26 130 views
3

我試圖制定一個規則,將重寫成嵌套樹(類似於二叉樹)。ANTLR規則重寫爲嵌套樹

例如:

a + b + c + d; 

解析會像(((a + b) + c) + d)樹。基本上每個根節點將有三個孩子(LHS'+'RHS),其中LHS可以是更多嵌套節點。

我嘗試一些事情,如:

rule: lhs '+' ID; 
lhs: ID | rule; 

rule 
    : rule '+' ID 
    | ID '+' ID; 

(有一些樹重寫),但他們都給我一個錯誤一下被甩遞歸。我不知道如何解決這個沒有某種類型的遞歸。

編輯:右邊這給我想要的東西相反我的最新嘗試遞歸:

rule:
ID (op='+' rule)?
-> {op == null}? ID
-> ^(BinaryExpression<node=MyBinaryExpression> ID $op rule)

給人(a + (b + (c + d)))

+0

你必須使用嵌套表達式,因爲ANTLR是LL(*)。見[這個問題](http://stackoverflow.com/questions/1452729/antlr-grammar-for-expressions?rq=1)。或者你可以在樹解析器中做到這一點,這可能會更容易/更快取決於你的語法。 – 2012-06-26 21:59:47

+0

如果'a + b'都是子節點,那麼根是什麼?你爲什麼不想以root身份運營? –

+0

根節點是一個虛構的節點。樹結構是我工作內容的一部分。 –

回答

2

後續的語法:

grammar T; 

options { 
    output=AST; 
} 

tokens { 
    BinaryExpression; 
} 

parse 
: expr ';' EOF -> expr 
; 

expr 
: (atom -> atom) (ADD a=atom -> ^(BinaryExpression $expr ADD $a))* 
; 

atom 
: ID 
| NUM 
| '(' expr ')' 
; 

ADD : '+'; 
NUM : '0'..'9'+; 
ID : 'a'..'z'+; 
SPACE : (' ' | '\t' | '\r' | '\n')+ {skip();}; 

解析您的輸入"a + b + c + d;"如下:

enter image description here

+0

這是完美的,謝謝巴特。 –

+0

不客氣@NicWolfe。 –

0

你嘗試

rule: ID '+' rule | ID; 

+0

是的,這給了我一棵倒退到我想要的樹: '(a +(b +(c + d)))' –