如何解决转移/减少冲突迫使转移或减少



当Yacc/Bison中存在shift/reduce冲突时,是否可以按照您的意愿强制解决冲突?换言之:是否有可能明确强制其优先考虑转移或减少?

就我所读到的内容而言,如果你对默认的解决方案感到满意,你可以告诉生成器不要抱怨它。我真的不喜欢这样,因为它混淆了你的理性选择。

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

最后,我已经阅读了可以解决这个问题的优先规则。我在很多方面都尝试过,但都没能成功。有可能使用优先级规则吗?怎样

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

 %token IF THEN ELSE variable
 %%
 stmt:
   expr
 | if_stmt
 ;
 if_stmt:
   IF expr THEN stmt
 | IF expr THEN stmt ELSE stmt
 ;
 expr:
   variable
 ;

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

以下对THENELSE的权限预定义的用法描述了if-then-else语句所需的行为(即,将else与最内部的if语句相关联)。

%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
    ;

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

IF expr1 THEN IF expr2 THEN IF expr3 THEN x ELSE y

解析为:

IF expr1 THEN (IF expr2 THEN (IF expr3 THEN (x ELSE (y))))

比森不再抱怨这个案子了。

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

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

如果您想通过减少来解决移位/减少冲突,可以使用优先级规则——只需确保要减少的规则的优先级高于要转移的令牌。棘手的部分是,如果存在涉及相同规则和令牌的多个移位/减少冲突,则可能无法为规则和令牌找到一组全局一致的先例,以您想要的方式解决问题。

相关内容

  • 没有找到相关文章

最新更新