当我尝试使用 Lemon 编译这个简单的解析器时,我遇到了冲突,但我看不出哪个规则是错误的。如果我删除二进制表达式或调用表达式,冲突就会消失。
%left Add.
program ::= expression.
expression ::= binaryexpression.
expression ::= callexpression.
binaryexpression ::= expression Add expression.
callexpression ::= expression arguments.
arguments ::= LParenthesis argumentlist RParenthesis.
arguments ::= LParenthesis RParenthesis.
argumentlist ::= expression argumentlist.
argumentlist ::= expression.
[编辑]向 LParenthesis 添加左侧关联性解决了冲突。但是,我很想知道这样做是否正确:我已经看到一些语法(fe C++)对于构造运算符'()'和调用运算符'()'具有不同的优先级。所以我不确定做正确的事。