首页 > 解决方案 > 如何在 Jison 的 bnf 表示法中调试减少/减少错误

问题描述

我正在用 Jison 编写 bnf 表示法并遇到减少/减少冲突:

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它不会产生减少/减少冲突,但仍然无法解析。

标签: syntaxbisonbnf

解决方案


这告诉你的是,有一些语法产生,其中非终结符PrimaryExpression(或扩展以 结尾的一些非终结符PrimaryExpression)后面可以跟一个SIMPLE_ASSIGN(或扩展以 开头的一些非终结符SIMPLE_ASSIGN,尽管这似乎不太可能) . 在这种情况下,Identifier(未显示其扩展)是模棱两可的,因为PrimaryExpressionLeftHandSideExpression都可以扩展为Identifier.

很难猜测可能是什么上下文,但追踪起来应该相当简单:只需查看可以在前面的每个非终结符SIMPLE_ASSIGN,直到找到可以以 . 结尾的非终结符PrimaryExpression。(不过,并非所有此类产生式都是错误的。它实际上高度依赖于语法。)


推荐阅读