2012-03-02 39 views
2

有人可以幫助我在這裏的規則,我在堅持了這一點:重寫ANTLR primaryExprList(OR^primaryExprList)*

primaryExprList ('|'^ primaryExprList)* 

我想讓它,而不是「|」使用BOOLEANOR

意見,沃伊斯拉夫·斯托伊科維奇:

我已經嘗試過了,但它不會正常工作,當我使用A | B | C就應該是這樣的

BOOLEANOR 
     |  \ 
BOOLEANOR  c 
|  | 
a  b 

和你soultion像這:

 BOOLEANOR 
/  |  \ 
    a  b  c 

這是不coorect。

回答

3

我真的沒有看到需要。如果定義BOOLEANOR令牌(詞法規則):

parse  : primaryExprList ('|'^ primaryExprList)*; 
// or:  primaryExprList (BOOLEANOR^ primaryExprList)* 

BOOLEANOR : '|'; 

然後根的類型與被BOOLEANOR和它的內部文本是"|"

但是,要回答你的問題(或提出解決方案),要真正改變根的方式,是通過使用一個重寫規則是這樣的:

grammar T; 

options { 
    output=AST; 
} 

tokens { 
    OTHER; 
} 

parse 
: expr EOF! 
; 

expr 
: (e1=primaryExprList -> $e1) ('|' e2=primaryExprList -> ^(OTHER $expr $e2))* 
; 

// other rules 

將解析輸入:「一個| b | C」爲以下AST:

enter image description here

0

這會有幫助嗎?

primaryExprList ('|' primaryExprList)* -> ^(BOOLEANOR primaryExprList+) 

還是我誤解了你的問題?

+0

再次檢查我的問題,有一個U A評論。由於名譽限制,我無法發佈答案,並且在評論中我無法寫出樹。 – sm13294 2012-03-02 16:24:10

+0

Bart的答案應該適用於編輯的問題。 – 2012-03-02 17:24:16