我目前正在研究编译器,据我所知,在LR(0)中有"shift/reduce“或"reduce/reduce”冲突的情况,但不可能有"shift/shift“冲突!为什么我们不能有“移位/移位”冲突?
发布于 2012-12-09 02:52:30
当解析器不能判断是移位(将下一个输入标记推入解析堆栈顶部)还是缩减(从解析堆栈中弹出一系列终端和非终端)时,就会发生Shift/reduce冲突。reduce/reduce冲突是解析器知道reduce,但不知道执行哪个reduce。
如果发生shift/shift冲突,解析器将知道它需要将下一个令牌推送到其解析堆栈上,但不知道如何做。由于只有一种方法可以将令牌推送到解析堆栈上,因此通常不会有任何这种形式的冲突。
也就是说,如果您有一个奇怪的设置,其中有两个或更多的转换导致给定的解析状态,并且标记了相同的终止符号,那么理论上可能存在shift/shift冲突。这种情况下的冲突将是是转换并转到一个状态,还是转换并转到另一个状态。如果您试图将自动机压缩为更少的状态,但操作不正确,或者您试图构建一个不确定的解析自动机,则可能会发生这种情况。在实践中,这种情况永远不会发生。
希望这能有所帮助!
https://stackoverflow.com/questions/13780216
复制相似问题