Bison 减少-减少语法冲突
我在bison中得到了以下语法的reduce/reduce冲突,因为n也是epsilon产生式Bison 减少-减少语法冲突,bison,reduce-reduce-conflict,Bison,Reduce Reduce Conflict,我在bison中得到了以下语法的reduce/reduce冲突,因为n也是epsilon产生式 m : {$$=line_no;} ; n : { $$.nl=makelist(line_no); codelines[line_no].opcode=GOTO;
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
;
如何修改此项以消除此冲突?您的语法似乎没有使用m的值。因此,您最好删除对m及其规则的所有引用 正如您所说,问题在于
n
的epsilon减少,这需要与ELSE
的移位相关联。该问题将在与“不明确的”else
完全相同的情况下发生,因为如果n
属于语句,则不清楚该属于哪个
显而易见且简单的解决方案是将n
移动到ELSE
之后,因为它对归约动作是在移位之前还是之后没有任何区别,而且移位之后,即使对于LALR
解析器也很清楚