2013-03-09 88 views
1

我想用C語法創建AST,可以找到here用c語法構建ast時管理操作優先級

l = k*j*5 - 10; 

我得到這樣的:然而,它沒有當我輸入驗證碼考慮與業務優先級,對於爲例

AST

的操作是用這個編碼管理

multiplicative_expression 
: primary_expression (('*'^ additive_expression) | ('/'^ additive_expression) | ('%'^ additive_expression))* 
; 

additive_expression 
: multiplicative_expression (('+'^ multiplicative_expression) | ('-'^ multiplicative_expression))* 
; 

有沒有解決這個問題的方法?

另一個問題,有沒有辦法在構建AST時添加特殊標記? 例如是這樣的:

A B C -> ^("VAR" B C) 

VAR是新的令牌只能與AST可以看出。

是否有可能通過別的方法重命名'nil'標記?

+0

您對'multiplicative_expression'的產物是錯誤的。 – 2013-03-09 16:16:39

+0

我想也是這樣,但我不知道它爲什麼是錯的。 – Exia0890 2013-03-09 17:54:41

+1

由於加法(和減法)的優先級比乘法(和除法)低,因此不能將「additive_expression」作爲乘法表達式的因子。該作品稱'2 * 3 + 4'應該被解釋爲'2 *(3 + 4)'。如果你在該生產中用'multiplicative_expression'替換'additive_expression',你將會解決這個問題。然而,你仍然有問題:24/4/2被解釋爲24 /(4/2),它應該是'(24/4)/ 2'。我不確定如何解決這個問題。 – 2013-03-09 18:13:23

回答

1

我絕對不是ANTLR的專家,但不應該這樣做你正在尋找什麼?

multiplicative_expression 
: primary_expression (('*'^|'/'^|'%'^) multiplicative_expression)* 
; 

additive_expression 
: multiplicative_expression (('+'^|'-'^) multiplicative_expression)* 
; 

編輯:很高興爲你工作。丹尼爾·菲捨爾的有關關聯點,想到的解決辦法是

multiplicative_expression 
: primary_expression | 
    (multiplicative_expression ('*'^|'/'^|'%'^) primary_expression) 
; 

additive_expression 
: multiplicative_expression | 
    (additive_expression ('+'^|'-'^) multiplicative_expression) 
; 

但是,我似乎記得讀取ANTLR在一個點上無法與左遞歸這樣的應對。讓我知道如果它不起作用。

+0

感謝您的回覆,不幸的是它仍然不是我正在尋找的,但它仍然更好。這裏是我得到http://i.imgur.com/RyvRu6v.png – Exia0890 2013-03-09 15:44:29

+0

對不起,我的壞,它的作品。這只是| additive_expression在評論中。 – Exia0890 2013-03-09 18:14:52

0

我找到了解決方案添加一個新的令牌,這樣做,我把這個開頭:

tokens { 
    VAR; 
} 

,然後我可以使用它。

0

周圍有很多正確的C grammars,爲什麼不使用其中之一?或者至少從那裏開始?

+0

感謝您的鏈接,事實上我從另一個語法開始:[this one](http://stuff.mit.edu/afs/athena/software/antlr_v3.2/examples-v3/java/C/C.g) – Exia0890 2013-03-09 17:55:55