1

bison2.4.1からのエラー回復を処理したい。

私はoreillyの本(lex&yacc)といくつかのウェブサイトを参照して、エラートークンをルールに入れました。

しかし、私はそれがうまくいかないと思います。エラー回復の処理には役立ちません!

私のコードは次のとおりです。

PDL:
    DataDesc ComputationDesc    {Build_front_proc($1,$2);}
    ;
DataDesc:
    PartyDecl AccLvDesc     {$$ = echo_dataDesc($1, $2);}
    ;
// Party Description
PartyDecl:
    PARTY ':' ID ',' ID ENDL    {if($3->is_func || $5->is_func)
                        yyerror("it is a reserved word!\n");
                    $$ = echo_partyDecl($3->name,$5->name);}
    |error ENDL         {printf("There is a error");}
    ;

「Party:id_a;」という言葉を出しました。(「Party」の後に2つのID名を付ける必要があります。)

そしてそれは直接yyerror()に行き、構文エラーを示しました...

なぜこのエラーを処理しないのかわかりません。

4

1 に答える 1

1

yacc/bison のエラー ルールは、エラーを防ぐのではなく、エラーから回復します。したがって、この場合、エラーが発生し (そして が呼び出されyyerror("syntax error"))、THEN は回復するエラー ルールを探します。したがって、この場合、 、、および','をシフトした後、シフトする を探している状態になります。この状態では aを解析できないため、構文エラーが発生します。エラーが発生した後、エラー生成のある状態が見つかるまで、状態のポップを開始します。その状態では、エラーをシフトし、期待状態にします。次に、入力記号 ( とその後のすべて) を、 が見つかるまで破棄します。PARTY':'ID';'PartyDeclENDL;ENDL、それがシフトし、PartyDecl: error ENDLルールを削減できる状態にして、呼び出しますprintf("There is a error");

が見つからない場合はENDL、EOF に達した後に終了し、エラーから回復することはありません。さらに、その後さらに 2 シフトの間、エラー回復モードのままになります。ENDLそれまでに別のエラーが発生した場合、yerror は呼び出されず、代わりに直接エラー回復に進みます。

于 2012-04-15T06:15:59.927 に答える