2012-12-08 52 views
8

我目前正在学习有关编译器和我在LR理解(0)有,我们有“移位/减少”或“降低/减少”冲突的情况下,但它是不可能有“移位/转移”的冲突!为什么我们不能有“转变/转变”冲突?当解析器不能告诉是否转移(推下一个输入令牌解析栈的顶上)或减少(从解析栈中弹出一个系列终端和非终结点的)为什么编译器不能有“移位/移位”冲突?

+2

有减少减少冲突,因为它们是可以选择减少处理的2个产品。 由于您可以通过一些生产转移和减少,所以存在转换减少冲突,并且显然仍然需要进行解析。 移动只是意味着1件事,你提前输入流,所以不能有移位冲突。 – axiom

回答

18

移位/减少冲突发生。减少/减少冲突是当解析器知道要减少时,但不知道要执行哪种减少。

如果你有移进/移冲突,解析器会知道,它需要THR下一个标记推到它的解析堆栈,但不知道如何做到这一点。由于只有一种方法可以将令牌推送到解析堆栈中,所以通常不会有任何此形式的冲突。

也就是说,如果您有一个奇怪的设置,其中存在两个或更多个从给定解析状态导出并用相同终端符号标记的转换,理论上可能存在移位/移位冲突。在这种情况下,冲突将是是转移到一个国家还是转移到另一个国家。如果您尝试将自动机压缩到更少的状态并且执行不正确,或者您尝试构建非确定性分析自动机,则可能会发生这种情况。在实践中,这绝不会发生。

希望这会有所帮助!

+0

第三段非常有用,谢谢! – alcuadrado