如何调试Jison中bnf表示法中的reduce/reduce错误



我正在用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(其扩展名未显示(是不明确的,因为PrimaryExpressionLeftHandSideExpression都可以扩展到Identifier

很难猜测这可能是什么上下文,但追踪起来应该相当简单:只需查看SIMPLE_ASSIGN之前的每个非终端,直到找到一个以PrimaryExpression结尾的终端。(不过,并不是所有这样的作品都是错误的。这在很大程度上取决于语法。(

最新更新