Parsing 移位/减少具有n元和/积的算术表达式语法中的冲突

Parsing 移位/减少具有n元和/积的算术表达式语法中的冲突,parsing,grammar,shift-reduce-conflict,Parsing,Grammar,Shift Reduce Conflict,解析二进制和/积很容易,但我在定义解析的语法时遇到了麻烦 a + b * c + d + e 作为 我最初(天真的)尝试产生了61个轮班/减少冲突 我使用的是java cup(但我认为任何其他解析器生成器的解决方案都很容易翻译)。以下ANTLR语法: parse : exp EOF ; exp : add_exp ; add_exp : mul_exp ('+' mul_exp)* ; mul_exp : atom ('*' atom)* ;

解析二进制和/积很容易,但我在定义解析的语法时遇到了麻烦

a + 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
解析为:

如您所见,
mul_exp
是树中距离最远的,将首先评估(使用适当的“遍历”树)

输入
a+b*(c+d)+e
解析为:

这些图像是用计算机生成的

编辑:

像这样的工具使调试语法变得轻而易举!例如,如果我单击上面语法中的
atom
规则,将自动生成并在屏幕底部显示以下内容:

当然,这条规则一点也不复杂,但是当你开始使用更复杂的规则时,很容易将它们形象化


HTH.

我们能看看您尝试的代码吗?答案很好。我马上就能明白为什么会这样。谢谢我不知道ANTLRWorks的事。。谢谢你的链接。
parse
  :  exp EOF
  ;

exp
  :  add_exp
  ;

add_exp
  :  mul_exp ('+' mul_exp)* 
  ;

mul_exp
  :  atom ('*' atom)* 
  ;

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

Number
  :  'a'..'z'
  ;