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'
;