我正在用Jison编写bnf表示法,并得到一个reduce/reduce冲突:
Conflict at state: 26, token: SIMPLE_ASSIGN
reduce by rule: PrimaryExpression -> Identifier
reduce by rule: LeftHandSideExpression -> Identifier
我的状态26看起来像这样:
item set 24
AssignmentExpression -> LeftHandSideExpression .AssignmentOperator AssignmentExpression
AssignmentOperator -> .SIMPLE_ASSIGN
AssignmentOperator -> .COMPLEX_ASSIGN
transitions -> {"AssignmentOperator":61,"SIMPLE_ASSIGN":62,"COMPLEX_ASSIGN":63}
item set 25
LogicalORExpression -> LogicalANDExpression .
LogicalANDExpression -> LogicalANDExpression .LOGICAL_AND EqualityExpression
transitions -> {"LOGICAL_AND":64}
item set 26
LeftHandSideExpression -> Identifier .
PrimaryExpression -> Identifier .
transitions -> {}
item set 27
LogicalANDExpression -> EqualityExpression .
EqualityExpression -> EqualityExpression .EQUALITY_OPERATOR RelationalExpression
transitions -> {"EQUALITY_OPERATOR":65}
我该如何解决这里的问题?
我正在使用Jison,并且我正在运行:jison -p lalr -t grammer/noa.bnf -t > log
有趣的是,我也在使用syntax-cli
,它不会产生reduce/reduce冲突,但在解析时仍然有问题。
这告诉你的是,在一些语法生成中,非终端PrimaryExpression
(或某个扩展以PrimaryExpression
结束的非终端(后面可以跟一个SIMPLE_ASSIGN
(或某一个扩展以SIMPLE_ASSIGN
开始的非终端,尽管这似乎不太可能(。在这种情况下,Identifier
(其扩展名未显示(是不明确的,因为PrimaryExpression
和LeftHandSideExpression
都可以扩展到Identifier
。
很难猜测这可能是什么上下文,但追踪起来应该相当简单:只需查看SIMPLE_ASSIGN
之前的每个非终端,直到找到一个以PrimaryExpression
结尾的终端。(不过,并不是所有这样的作品都是错误的。这在很大程度上取决于语法。(