0

n もイプシロン プロダクションであるため、bison の次の文法で reduce/reduce の競合が発生しています。

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

あなたが言うように、問題は のイプシロン削減でありn、これは のシフトに関連付ける必要がありますELSE。この問題は、"ambiguous" とまったく同じ状況で発生します。これは、そのステートメントがどのステートメントに属しelseているかが明確でないためです。ifn

明らかで簡単な解決策は、リダクション アクションがシフトの前に発生するか後で発生するかに違いはなく、シフトの後はパーサーでも明らかであるため、 をn後に移動することです。ELSELALR

于 2012-11-01T14:57:06.860 に答える
0

あなたの文法は m の値を使用していないようです。したがって、m とそのルールへのすべての参照を削除することもできます。

于 2012-11-01T13:39:35.727 に答える