簡體   English   中英

用n元和/乘積移位/減少算術表達式語法中的沖突

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM