我目前正在研究编译器,据我了解,在 LR(0) 中,有时会出现“shift/reduce”或“reduce/reduce”冲突,但不可能出现“shift/shift”冲突!为什么我们不能发生“转变/转变”冲突?
最佳答案
当解析器无法判断是否要移位(将下一个输入标记插入解析堆栈顶部)或归约(从解析堆栈中弹出一系列终结符和非终结符)时,就会发生移位/归约冲突。归约/归约冲突是指解析器知道要归约,但无法判断要执行哪个归约。
如果发生移位/移位冲突,解析器会知道它需要将下一个标记插入其解析堆栈,但不知道如何执行。由于只有一种方法将 token 压入解析堆栈,因此通常不会出现任何这种形式的冲突。
也就是说,如果您有一个奇怪的设置,其中有两个或多个转换从给定的解析状态引出并标有相同的终止符号,那么理论上可能存在移位/移位冲突。在这种情况下,冲突将是是转移到一个状态还是转移到另一个状态。如果您尝试将自动机压缩为更少的状态但操作错误,或者尝试构建不确定性解析自动机,则可能会发生这种情况。实际上,这永远不会发生。希望这有帮助!
关于parsing - 为什么编译器不能出现 "shift/shift"冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13780216/