Bison:在处理可选规则时,转换/减少冲突解决



在.y(yacc--bison)文件的语法中,我定义了以下规则:

C:E|D|F|A

A:B|B'['C']';

(这类似于带可选[C]的B)当我使用正确的lexer文件以适当的方式编译.y文件时,我得到了以下shift\reduce冲突:

状态48
74 A:B
75|B.'['C']'
"["移位,然后转到状态91
'['[使用规则74(A)减少]
$default reduce using rule 74(A)

我的问题是,如果它有前置"[",我希望它转移而不是减少。问题是,在文档上搜索数小时时,我找不到此错误的解决方案。如何修复此问题(请具体说明代码)。

问题是,在某些上下文中,A后面可能跟有[。如果不多看语法,就不可能更精确。

然而,值得注意的是,bison/yacc将完全按照您的意愿行事:解决冲突以支持转变。因此,除了警告之外,一切都应该很好。

如果你试图扩展A规则,你会得到两种可能的状态

状态1:

A -> B

状态2:

A -> B
A -> BC

A的所有可能状态如下

A -> B (State 1)
A -> B (State 2)
A -> BC

Bison无法确定您是否处于B输入的状态1或2。

您可以将A规则替换为(假设B和C是令牌):

A: B | B C

相关内容

  • 没有找到相关文章

最新更新