如何解决移进/归约冲突迫使档或减少?(How to resolve a shift/reduce c

2019-09-21 11:16发布

当有移进/减少的Yacc /鬼冲突,是有可能迫使被精确求解为你想要的冲突? 换句话说:这可能明确地迫使它移位或降低优先级?

对于我已阅读,如果你喜欢默认的分辨率,你能告诉发电机不抱怨 。 我真的,因为它混淆你的理性选择不喜欢这样。

另一种选择是重写语法来解决该问题。 我不知道这是总是可能的,往往这使得它更难理解。

最后,我看了优先规则可以解决这个问题。 我无言以对试过在很多方面,我不能使它工作。 是否有可能使用的优先规则? 怎么样?

虽然我的暧昧语法很不同,我可以使用传统的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
 ;

Answer 1:

据我所知,这是不可能直接解析器通过选择以减少解决S / R冲突。 虽然我可能是错的,它可能是不明智的继续尝试这种方式。 因此,唯一的可能性是要么重写语法,或通过移动解决冲突。

右predecence的以下使用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 ,以查看是否产生解析器状态机是正确的。



Answer 2:

那么,对于转变默认分辨率/减少冲突的转移,因此,如果这是你想要的,你不需要做任何事情(除了忽略警告)。

如果你想解决的转变/减少减少冲突,你可以使用优先规则 - 只要确保规则被减少为优先级高于令牌移位。 最棘手的部分谈到,如果有多个移进/归约涉及相同的规则和标记冲突,它可能无法找到一个全球统一的一套优先级的规则和标记它解决的事情,你想要的方式。



文章来源: How to resolve a shift/reduce conflict forcing a shift or a reduce?