0

yaccで-vオプションを使用して、y.outputファイルを作成しました。ファイルの上部に「

状態98の競合:1シフト/削減

ファイルのさらに下には、次のものがあります。

state 98

   30 selection_stmt: IF '(' expression ')' statement .
   31               | IF '(' expression ')' statement . ELSE statement

    ELSE  shift, and go to state 101

    ELSE      [reduce using rule 30 (selection_stmt)]
    $default  reduce using rule 30 (selection_stmt)

競合とは何ですか?どのように修正できますか?

4

3 に答える 3

1

ステートメントのほとんどすべてのshift/reduce エラーはif/then/else、悪名高いダングリング else問題です。

このコード セグメントでは:

if (f1):
    if (f2):
        c1
    else:
        c2

あなた(そして Python は奇妙なインデント ルールのため) がどちらifelse属しているかを知っていますが、パーサーはそれほど賢くありません。

elseが first に属するか second に属するかはわかりませんif

このリンクは、LR(n) を LR(1) に変換して問題を解決する方法を示しています。

もう 1 つの方法は、ベース言語の定義を (可能であれば) 変更して、あいまいさがなくなるようにすることです。

: IF '(' cond ')' THEN statement ENDIF
| IF '(' cond ')' THEN statement ELSE statement ENDIF
于 2009-11-18T07:49:59.877 に答える
0

次のようなことを試してください:

election_stmt: IF '(' expression ')' statement . selection_stmt_else_part;
selection_stmt_else_part: ELSE statement 
                        | 
                        ;
于 2009-11-18T07:49:12.827 に答える
0

ええと、この問題に対する正しい答えは通常、何もしないことです。

あいまいな文法では、シフト/リデュースの競合が予想されます。それらはエラーではなく、競合です。

この競合は、reduce よりも shift を優先することで解決されます。これにより、たまたま正規のダングリング else 問題が解決されます。

また、バイソンには %expect nステートメントもあるため、正確にn 個の競合がある場合に S/R 競合の警告が表示されません。

于 2013-01-11T23:12:33.660 に答える