【问题标题】:Bison: Shift/Reduce Conflict resolution when dealing with optional rulesBison:在处理可选规则时转移/减少冲突解决
【发布时间】:2016-03-25 22:04:58
【问题描述】:

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

C : E | D | F |一个

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

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

状态 48
74 甲:乙。
75 |乙。 '['C']'
'[' 切换,进入状态 91
'[' [减少使用规则 74 (A)]
$default 减少使用规则 74 (A)

如果它有前任'['我希望它转移而不是减少,我的问题如下。问题是我在文档中搜索数小时时找不到此错误的解决方案。 我该如何解决这个问题(请具体到代码)。

【问题讨论】:

  • 您没有提供足够的信息来重现您的错误。当我从您的示例创建野牛文件时,我发现没有问题。请显示更多重现您的错误的代码。

标签: bison yacc shift-reduce-conflict


【解决方案1】:

问题在于,在某些情况下,A 可能后跟 [。没有看到更多的语法,不可能更精确。

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

【讨论】:

    【解决方案2】:

    如果你尝试扩展 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多