我正在创建一个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)
谢谢!
答案 0 :(得分:2)
有两种类型的冲突:减少/减少和转移/减少。当出现任何冲突时,这是因为你创建的语法是模糊的。你的shift / reduce出现是因为Byacc不知道它是否应该减少规则'body'并进入状态36(就像“我找到了这个规则,给我输入下一个!”)或者,如果它应该转移(消费/接受)另一个令牌并继续寻找接受的规则(喜欢“我没有找到完整的规则,但给我更多的输入,也许我会)。
Byacc始终生成一个明确的语法分析器。怎么样?当出现冲突(怀疑)时,它只选择一个。哪一个?对于reduce / reduce,它选择第一个出现在文件中。对于shift / reduce,它默认选择总是移位。所以...它会在默认情况下产生你想要的行为。
尽管如此,拥有一个明确的语法是个好主意。为此你必须解决冲突。这意味着你必须找到一种方法来避免Byacc犹豫不决。我希望别人可以帮助你,我不是专家。我知道你可以通过减少规则数量和删除空规则来实现它,例如:
A: /* empty */
| a
;