1

bnf コンバーターのルールの優先順位に問題があります。ここでいくつかのルールをコピーします

CParams. CallParams ::= [CallParam] ;
separator CallParam "," ;
VarCParam. CallParam ::= Ident ;
ExpCParam. CallParam ::= Exp ;
BExpCParam. CallParam ::= BExp ;
[...]
EVar. Exp3 ::= Ident ;
[...]
BVar. BExp2 ::= Ident ;

私はサンプルプログラムを書きます:

void p(int a) {
    a = a+7;
    print a;
}
main() {
    int i;
    p(i);
}

その結果、p(i) が CParams [VarCParam (Ident "i")] に変換されることを期待していますが、CParams [BExpCParam (BVar (Ident "i"))] に変換されます。

このバグを修正するためにルールを変更する方法を教えてください

4

1 に答える 1

1

文法に矛盾があります: 両方のツリーが可能です。happy1つの方法を選択するだけですが、おそらくコンパイル中に次のように出力されます:

reduce/reduce conflicts: 2

それを修正するには、これらのルールの 1 つを削除する必要があります。

VarCParam. CallParam ::= Ident ;
BExpCParam. CallParam ::= BExp ;
BVar. BExp2 ::= Ident ;
于 2013-11-21T11:49:31.783 に答える