0

当我尝试使用 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++)对于构造运算符'()'和调用运算符'()'具有不同的优先级。所以我不确定做正确的事。

4

1 回答 1

0

问题是语法不明确。不可能在减少binaryexpressioncallexpression不查看所有输入序列之间做出决定。歧义是因为左递归expression,因为expression不能导出终端,所以不能结束。

于 2012-07-20T12:46:22.483 回答