如何解决即使未声明运算符优先级或关联性,为什么将1 * 2 + 3解析为1 *2 + 3?
我使用fsyacc(fsharp的yacc)编写一个小型解析器。语法就像
Expr:=
| INT { Cst $1 }
| Expr PLUS Expr { Op("+",$1,$3) }
| Expr TIMES Expr { Op("*",$3) }
然后,在不声明优先级或关联性的情况下,我将“ 1 * 2 + 3”解析为
Op ("*",Cst 1,Op ("+",Cst 2,Cst 3)
为什么?
解决方法
如果您没有在您所描述的模棱两可的语法中声明令牌的优先级和关联性,则默认情况下,yacc将解决由此产生的移位/减少冲突(有利于移位)。这具有使规则向右递归的作用,因此运算符似乎会从右到左分组。
如果您要做定义优先级规则,则它们的作用是解决移位/减少冲突,以支持较高的优先级(令牌或规则),或者如果优先级相同,则为优先级的移位%right
并减少%left
。这基本上就是优先级设置的全部工作,因此有时您可以将它们用于解决冲突,而这实际上与“优先级”无关。但是对于简单的中缀表达式语法,它们基本上可以完全满足您的要求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。