0

我在野牛中遇到以下语法的减少/减少冲突,因为 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
    ;

如何修改它以消除此冲突?

4

2 回答 2

1

正如您所说,问题是 的 epsilon 减少n,这需要与ELSE. 问题将出现在与 "ambiguous" 完全相同的情况下else,因为不清楚属于哪个if语句n

显而易见且简单的解决方案是在 then之后移动,ELSE因为归约动作发生在移位之前还是之后都没有任何区别,而在移位之后,即使LALR解析器也很清楚。

于 2012-11-01T14:57:06.860 回答
0

您的语法似乎没有使用 m 的值。因此,您不妨删除对 m 及其规则的所有引用。

于 2012-11-01T13:39:35.727 回答