[英]Shift / reduce conflicts in grammar of arithmetic expression with n-ary sums / products
解析二進制和/的乘積很容易,但是我很難定義一個語法來解析
a + b * c + d + e
如
sum(a, prod(b, c), d, e)
我的初始(幼稚)嘗試產生了61個移位/減少沖突。
我正在使用Java cup(但是我想任何其他解析器生成器的解決方案都可以輕松翻譯)。
以下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
解析為:
替代文字http://img266.imageshack.us/img266/7099/17212574.png
如您所見, mul_exp
在樹上最遠,並且(首先在樹中進行適當的“遍歷”)將被評估。
輸入a + b * (c + d) + e
解析為:
替代文字http://img688.imageshack.us/img688/2207/89332200.png
圖像是使用ANTLRWorks生成的。
編輯:
像ANTLRWorks這樣的工具使調試語法變得輕而易舉! 例如,如果我在點擊atom
在上面的語法規則,下面是自動生成的,並在屏幕的底部顯示:
替代文字http://img340.imageshack.us/img340/6793/53395907.png
當然,該規則一點也不復雜,但是當您使用更復雜的規則時,將它們可視化是非常容易的。
HTH。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.