减少 - 减少语法冲突

时间:2012-11-01 12:31:08

标签: bison reduce-reduce-conflict

我在野牛中获得以下语法的减少/减少冲突,因为n也是epsilon产生。

m   :                       {$$=line_no;}
    ;
n   :                       {   

                            $$.nl=makelist(line_no);
                            codelines[line_no].opcode=GOTO;
                            codelines[line_no].result=0;
                            line_no++;
                            }
    ;
selection_statement
    : IF '(' expression ')' m statement         %prec THAN
    | IF '(' expression ')' m statement n ELSE m statement
    | SWITCH '(' expression ')' statement
    ;

如何修改此设置以消除此冲突?

2 个答案:

答案 0 :(得分:1)

正如你所说,问题是n的epsilon减少,需要与ELSE的转移相关联。问题将出现在与“模棱两可”else完全相同的情况下,因为if所属的n语句不清楚。

明显而简单的解决方案是在n之后移动ELSE,因为减少动作是在变速之前还是之后发生没有任何区别,并且在变速之后它甚至是明显的到LALR解析器。

答案 1 :(得分:0)

你的语法似乎没有使用m的值。所以你不妨删除对m及其规则的所有引用。