syntax - 如何在 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
它不会产生减少/减少冲突,但仍然无法解析。
解决方案
这告诉你的是,有一些语法产生,其中非终结符PrimaryExpression
(或扩展以 结尾的一些非终结符PrimaryExpression
)后面可以跟一个SIMPLE_ASSIGN
(或扩展以 开头的一些非终结符SIMPLE_ASSIGN
,尽管这似乎不太可能) . 在这种情况下,Identifier
(未显示其扩展)是模棱两可的,因为PrimaryExpression
和LeftHandSideExpression
都可以扩展为Identifier
.
很难猜测可能是什么上下文,但追踪起来应该相当简单:只需查看可以在前面的每个非终结符SIMPLE_ASSIGN
,直到找到可以以 . 结尾的非终结符PrimaryExpression
。(不过,并非所有此类产生式都是错误的。它实际上高度依赖于语法。)
推荐阅读
- javascript - React Native、Redux 和 Navigation:从导航传递参数时处理状态更新
- javascript - 使用 js 和触发事件“提交”提交 FORM
- r - 在闪亮仪表板标题部分的同一行中添加图像和标题
- python - 通过 Python 连接到 TM1,在哪里可以找到“地址”和“端口”参数
- r - 使用阿森纳函数 tableby 创建多列并将特定的数字统计信息添加到一行
- flutter - 使用 ListView 和 ExpansionTile 构建页面
- javascript - MDBootstrap(引导的材料设计)冲突版本的反应
- groovy - groovy:在循环上迭代函数
- javascript - React Rest API 问题
- scala - 实现以 Pyspark 文件为源的 Scala 读取代码