我正在尝试学习Lemon 解析器生成器的基础知识,但我很快就卡住了。
这是一个小语法:
%right PLUS_PLUS.
%left DOT.
program ::= expr.
member_expr ::= expr DOT IDENTIFIER.
lhs_expr ::= member_expr.
expr ::= lhs_expr.
expr ::= PLUS_PLUS lhs_expr.
它导致1个解析冲突:
State 3:
(3) expr ::= lhs_expr *
(4) expr ::= PLUS_PLUS lhs_expr *
DOT reduce 3 expr ::= lhs_expr
DOT reduce 4 ** Parsing conflict **
{default} reduce 4 expr ::= PLUS_PLUS lhs_expr
然而,如果我将最后一条规则重写如下:
expr ::= PLUS_PLUS expr DOT IDENTIFIER.
然后它不会引起冲突。但我认为这不是正确的方法。
如果有人能解释什么是正确的方法以及为什么,我将不胜感激。