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

use*_*149 12 compiler-construction parsing compilation lr-grammar

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

tem*_*def 23

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

如果你有一个移位/移位冲突,解析器会知道它需要将下一个令牌推送到其解析堆栈,但不知道该怎么做.由于只有一种方法将令牌推送到解析堆栈,因此通常不会出现此形式的任何冲突.

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

希望这可以帮助!