Parsing 为什么可以';一个编译器有一个";轮班;冲突?

Parsing 为什么可以';一个编译器有一个";轮班;冲突?,parsing,compiler-construction,compilation,lr,Parsing,Compiler Construction,Compilation,Lr,我目前正在研究编译器,据我在LR(0)中了解,有些情况下会出现“移位/减少”或“减少/减少”冲突,但不可能出现“移位/移位”冲突!为什么不能有“shift/shift”冲突?当解析器无法判断是移位(将下一个输入标记推到解析堆栈顶部)还是缩减(从解析堆栈中弹出一系列终端和非终端)时,会发生shift/reduce冲突。reduce/reduce冲突是当解析器知道要进行reduce,但无法判断要执行哪个reduce时 如果发生移位/移位冲突,解析器会知道需要将下一个标记推送到其解析堆栈上,但不知道如

我目前正在研究编译器,据我在LR(0)中了解,有些情况下会出现“移位/减少”或“减少/减少”冲突,但不可能出现“移位/移位”冲突!为什么不能有“shift/shift”冲突?

当解析器无法判断是移位(将下一个输入标记推到解析堆栈顶部)还是缩减(从解析堆栈中弹出一系列终端和非终端)时,会发生shift/reduce冲突。reduce/reduce冲突是当解析器知道要进行reduce,但无法判断要执行哪个reduce时

如果发生移位/移位冲突,解析器会知道需要将下一个标记推送到其解析堆栈上,但不知道如何执行。因为只有一种方法可以将令牌推送到解析堆栈上,所以通常不会有这种形式的冲突

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


希望这有帮助

存在减少冲突,因为可以选择两个产品来减少句柄。存在shift-reduce冲突,因为您可以通过一些产品同时进行shift和reduce,而且显然仍然可以继续解析。Shift只意味着一件事,您推进输入流,因此不会有Shift-Shift冲突。LL解析器中的第一个冲突通过左因子分解消除,我还了解到左因子分解用于消除非确定性。语法非决定论的首要冲突表现也是如此。此外,移位冲突(如果我们假设它存在)与FF冲突类似。类似地,我读到强制关联和/或优先级消除了SR和RR冲突,也消除了语法的歧义。SR和RR冲突是语法模糊性的表现吗?语法既可以是确定性的,也可以是可左因子的——两者并不相互排斥。(顺便说一句,你的意思是“含糊不清”而不是“确定的”)并不是所有的第一/第一冲突都可以通过左分解消除,因为有些语言不是LL(1),因此没有任何LL(1)语法。因为LL和LR解析器的工作方式根本不同,所以我认为在第一个/第一个冲突和shift/shift或shift/reduce冲突之间进行比较并不容易;这些发生的原因非常不同。虽然每一个模棱两可的语法都会导致移位/减少或减少/减少冲突,但反之则不然。由于并非所有上下文无关语言都有LR语法,因此您可以使用仍然会导致这些冲突的明确语法。