在.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