Byacc冲突

时间:2011-04-11 11:42:24

标签: c++ compiler-construction yacc conflict

我正在创建一个byacc程序来解析一些输入,而我在解决shift / reduce冲突时遇到问题,在这种情况下,我怎么能告诉byac总是移位?

    53: shift/reduce conflict (shift 49, reduce 36) on '('
    53: shift/reduce conflict (shift 50, reduce 36) on '['
    53: shift/reduce conflict (shift 51, reduce 36) on '{'
    state 53
        body : start_section . section end_section  (32)
        body : start_section . section  (33)
        body : start_section .  (36)
        body : start_section . end_section  (38)

谢谢!

1 个答案:

答案 0 :(得分:2)

有两种类型的冲突:减少/减少和转移/减少。当出现任何冲突时,这是因为你创建的语法是模糊的。你的shift / reduce出现是因为Byacc不知道它是否应该减少规则'body'并进入状态36(就像“我找到了这个规则,给我输入下一个!”)或者,如果它应该转移(消费/接受)另一个令牌并继续寻找接受的规则(喜欢“我没有找到完整的规则,但给我更多的输入,也许我会)。

Byacc始终生成一个明确的语法分析器。怎么样?当出现冲突(怀疑)时,它只选择一个。哪一个?对于reduce / reduce,它选择第一个出现在文件中。对于shift / reduce,它默认选择总是移位。所以...它会在默认情况下产生你想要的行为。

尽管如此,拥有一个明确的语法是个好主意。为此你必须解决冲突。这意味着你必须找到一种方法来避免Byacc犹豫不决。我希望别人可以帮助你,我不是专家。我知道你可以通过减少规则数量和删除空规则来实现它,例如:

A:            /* empty */
 | a
 ;