0

この単純なパーサーを Lemon を使用してコンパイルしようとすると、競合が発生しますが、どのルールが間違っているのかわかりません。binaryexpression または callexpression を削除すると、競合がなくなります。

%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

問題は、文法があいまいであることです。すべての入力シーケンスを調べずに削減するbinaryexpressionかどうかを決定することはできません。callexpressionあいまいさは、 に対する左再帰が原因であり、終端を導出できないexpressionために終了できません。expression

于 2012-07-20T12:46:22.483 に答える