Bison:在处理可选规则时切换/减少冲突解决方案

时间:2016-03-25 22:04:59

标签: bison yacc shift-reduce-conflict

关于.y(yacc - bison)文件的语法,我已经定义了以下规则:

  

C:E | D | F |甲

     

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

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

  

国家48
   74 A:B。
   75 | B。 ' [' C']'
  ' ['转移,并转到州91   ' [' [减少使用规则74(A)]
     $ default使用规则74(A)减少

我的问题如下,如果它有前任' ['我想让它转移而不是减少。问题是我在文档上搜索了几个小时,找不到这个错误的解决方案。 我该如何解决这个问题(请特定于代码)。

2 个答案:

答案 0 :(得分:1)

问题在于,有一些上下文A可能后面跟[。没有看到更多的语法,就不可能更精确。

然而,值得注意的是,野牛/ yacc将完全按照你的意愿行事:解决冲突,转而支持这种转变。所以除了警告之外,一切都应该没问题。

答案 1 :(得分:0)

如果您尝试展开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