解析二進制求和/產品有容易,但是我有限定解析移位/減少算術表達式文法衝突與n進制求和/產品
a + b * c + d + e
作爲
sum(a, prod(b, c), d, e)
語法麻煩
我最初(天真)的嘗試產生了61次轉換/減少衝突。
我正在使用java杯(但我想任何其他解析器生成器的解決方案將很容易翻譯)。
解析二進制求和/產品有容易,但是我有限定解析移位/減少算術表達式文法衝突與n進制求和/產品
a + b * c + d + e
作爲
sum(a, prod(b, c), d, e)
語法麻煩
我最初(天真)的嘗試產生了61次轉換/減少衝突。
我正在使用java杯(但我想任何其他解析器生成器的解決方案將很容易翻譯)。
以下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。
我們可以看到您的嘗試代碼嗎? – 2010-02-18 12:49:55