2010-02-18 37 views
1

解析二進制求和/產品有容易,但是我有限定解析移位/減少算術表達式文法衝突與n進制求和/產品

a + b * c + d + e 

作爲

sum(a, prod(b, c), d, e) 
語法麻煩

我最初(天真)的嘗試產生了61次轉換/減少衝突。

我正在使用java杯(但我想任何其他解析器生成器的解決方案將很容易翻譯)。

+0

我們可以看到您的嘗試代碼嗎? – 2010-02-18 12:49:55

回答

3

以下ANTLR語法:

parse 
    : exp EOF 
    ; 

exp 
    : add_exp 
    ; 

add_exp 
    : mul_exp ('+' mul_exp)* 
    ; 

mul_exp 
    : atom ('*' atom)* 
    ; 

atom 
    : Number 
    | '(' exp ')' 
    ; 

Number 
    : 'a'..'z' 
    ; 

解析輸入a + b * c + d + e爲:

alt text http://img266.imageshack.us/img266/7099/17212574.png

正如你所看到的,mul_exp是樹中最遠和(使用適當的「走過」你的樹)將首先評估。

和輸入a + b * (c + d) + e被分析爲:

alt text http://img688.imageshack.us/img688/2207/89332200.png

對圖像進行與ANTLRWorks生成。

編輯:

ANTLRWorks的工具使調試語法變得輕而易舉!例如,如果我在上面的語法點擊​​規則,下面是自動生成並顯示在屏幕的底部:

alt text http://img340.imageshack.us/img340/6793/53395907.png

當然,這條規則並不複雜可言,但是當你開始使用更復雜的規則時,可以很容易地將它們形象化。

HTH。

+0

美麗的答案。我可以馬上看到爲什麼這個工作。謝謝! – aioobe 2010-05-03 12:12:29

+0

我不知道ANTLRWorks ..感謝您的鏈接。 – aioobe 2010-05-03 12:15:15

+0

@aioobe,很高興聽到這一消息,歡迎您。 – 2010-05-03 12:15:22