首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么编译器不能有"shift/shift“冲突?

为什么编译器不能有"shift/shift“冲突?
EN

Stack Overflow用户
提问于 2012-12-09 01:57:45
回答 1查看 6.1K关注 0票数 12

我目前正在研究编译器,据我所知,在LR(0)中有"shift/reduce“或"reduce/reduce”冲突的情况,但不可能有"shift/shift“冲突!为什么我们不能有“移位/移位”冲突?

EN

回答 1

Stack Overflow用户

发布于 2012-12-09 02:52:30

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

如果发生shift/shift冲突,解析器将知道它需要将下一个令牌推送到其解析堆栈上,但不知道如何做。由于只有一种方法可以将令牌推送到解析堆栈上,因此通常不会有任何这种形式的冲突。

也就是说,如果您有一个奇怪的设置,其中有两个或更多的转换导致给定的解析状态,并且标记了相同的终止符号,那么理论上可能存在shift/shift冲突。这种情况下的冲突将是是转换并转到一个状态,还是转换并转到另一个状态。如果您试图将自动机压缩为更少的状态,但操作不正确,或者您试图构建一个不确定的解析自动机,则可能会发生这种情况。在实践中,这种情况永远不会发生。

希望这能有所帮助!

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13780216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档