为什么编译器不能发生“转移/转移”冲突?

时间:2012-12-08 17:57:45

标签: parsing compiler-construction compilation lr

我目前正在研究编译器,正如我在LR(0)中所理解的,有些情况下我们有" shift / reduce"或者"减少/减少"冲突,但不可能转移/转移"冲突!为什么我们不能进行"转移/转移"冲突?

1 个答案:

答案 0 :(得分:21)

当解析器无法判断是否移位(在解析堆栈顶部推送下一个输入令牌)或减少(从解析堆栈弹出一系列终端和非终端)时,会发生Shift / reduce冲突。减少/减少冲突是指解析器知道减少,但无法确定要执行的减少。

如果您遇到移位/移位冲突,解析器会知道它需要将下一个令牌推送到其解析堆栈,但不知道如何执行此操作。由于只有一种方法可以将令牌推送到解析堆栈,因此通常不会出现此形式的任何冲突。

也就是说,理论上可能存在移位/移位冲突,如果你有一个奇怪的设置,其中有两个或多个转换通过一个给定的解析状态,标记有相同的终端符号。在这种情况下的冲突将是转移到一个州或转移到另一个州。如果您尝试将自动机压缩到较少的状态并且这样做不正确,或者您尝试构建非确定性解析自动机,则可能会发生这种情况。在实践中,这永远不会发生。

希望这有帮助!