我在野牛中获得以下语法的减少/减少冲突,因为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
;
如何修改此设置以消除此冲突?
答案 0 :(得分:1)
正如你所说,问题是n
的epsilon减少,需要与ELSE
的转移相关联。问题将出现在与“模棱两可”else
完全相同的情况下,因为if
所属的n
语句不清楚。
明显而简单的解决方案是在n
之后移动ELSE
,因为减少动作是在变速之前还是之后发生没有任何区别,并且在变速之后它甚至是明显的到LALR
解析器。
答案 1 :(得分:0)
你的语法似乎没有使用m的值。所以你不妨删除对m及其规则的所有引用。