Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bison 减少-减少语法冲突_Bison_Reduce Reduce Conflict - Fatal编程技术网

Bison 减少-减少语法冲突

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;

我在bison中得到了以下语法的reduce/reduce冲突,因为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
    ;

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

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

正如您所说,问题在于
n
的epsilon减少,这需要与
ELSE
的移位相关联。该问题将在与“不明确的”
else
完全相同的情况下发生,因为如果
n
属于
语句,则不清楚该
属于哪个

显而易见且简单的解决方案是将
n
移动到
ELSE
之后,因为它对归约动作是在移位之前还是之后没有任何区别,而且移位之后,即使对于
LALR
解析器也很清楚