首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决强制shift或reduce的shift/reduce冲突?

如何解决强制shift或reduce的shift/reduce冲突?
EN

Stack Overflow用户
提问于 2012-08-22 09:09:50
回答 2查看 3.2K关注 0票数 3

当Yacc/Bison中存在shift/reduce冲突时,是否有可能强制完全按照您的要求解决冲突?换句话说:是否有可能明确地强制它优先进行移位或减少?

根据我所读到的,如果你对默认分辨率满意,你可以告诉生成器not complain about it。我真的不喜欢这样,因为它混淆了你的理性选择。

另一种选择是重写语法来解决这个问题。我不知道这是否总是可能的,而且通常这会让人更难理解。

最后,我已经阅读了优先规则可以解决这个问题。我不知所措地尝试了很多方法,但我不能让它工作。是否可以对此使用优先规则?多么?

尽管我的模棱两可的语法非常不同,但我可以使用Bison manual中的经典if-then-else来给出一个具体的例子:

代码语言:javascript
复制
 %token IF THEN ELSE variable
 %%
 stmt:
   expr
 | if_stmt
 ;

 if_stmt:
   IF expr THEN stmt
 | IF expr THEN stmt ELSE stmt
 ;

 expr:
   variable
 ;
EN

回答 2

Stack Overflow用户

发布于 2012-08-28 04:36:37

据我所知,不可能通过选择reduce来指导解析器解决S/R冲突。尽管我可能错了,但无论如何,这样做可能是不明智的。因此,唯一的可能性是要么重写语法,要么通过转换来解决冲突。

THENELSE的right predecence的以下用法描述了if-then-else语句的所需行为(即,将else与最内层的if语句相关联)。

代码语言:javascript
复制
%token IF THEN ELSE variable
%right THEN ELSE

%%

stmt
    : expr
    | if_stmt
    ;

if_stmt
    : IF expr THEN stmt
    | IF expr THEN stmt ELSE stmt
    ;

expr
    : variable
    ;

通过为上述令牌选择正确的关联,以下序列:

代码语言:javascript
复制
IF expr1 THEN IF expr2 THEN IF expr3 THEN x ELSE y

解析为:

代码语言:javascript
复制
IF expr1 THEN (IF expr2 THEN (IF expr3 THEN (x ELSE (y))))

Bison也不再抱怨这个案子了。

请记住,您始终可以运行bison file.y -r all并检查file.output,以查看生成的解析器状态机是否正确。

票数 1
EN

Stack Overflow用户

发布于 2012-08-28 06:09:03

那么,shift/reduce冲突的默认解决方案是shift,所以如果这是您想要的,那么您不需要做任何事情(除了忽略警告之外)。

如果您想通过reduce来解决shift/reduce冲突,您可以使用优先级规则--只要确保要缩减的规则比要移位的令牌具有更高的优先级即可。如果存在涉及相同规则和令牌的多个shift/reduce冲突,则可能无法找到规则和令牌的全局一致的优先级集,从而以您想要的方式解决问题。

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

https://stackoverflow.com/questions/12065125

复制
相关文章

相似问题

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