我目前正在研究编译器,据我所知,在 LR(0) 中存在“移位/减少”或“减少/减少”冲突的情况,但不可能发生“移位/移位”冲突!为什么我们不能有“班次/班次”冲突?
问问题
6286 次
1 回答
24
当解析器无法判断是移位(将下一个输入令牌推入解析堆栈顶部)还是减少(从解析堆栈中弹出一系列终端和非终端)时,就会发生移位/归约冲突。归约/归约冲突是解析器知道归约,但不知道要执行哪个归约。
如果您要发生移位/移位冲突,解析器会知道它需要将下一个令牌推入其解析堆栈,但不知道如何去做。由于只有一种方法可以将令牌推入解析堆栈,因此通常不会出现这种形式的任何冲突。
也就是说,如果您有一个奇怪的设置,其中有两个或多个转换从给定的解析状态引出并标有相同的终端符号,那么理论上可能存在移位/移位冲突。在这种情况下,冲突将是是否转移并进入一个状态或转移并进入另一个状态。如果您尝试将自动机压缩为更少的状态并且操作不正确,或者您尝试构建非确定性解析自动机,则可能会发生这种情况。在实践中,这永远不会发生。
希望这可以帮助!
于 2012-12-08T18:52:30.187 回答