3

エラー回復のメカニズムとして、文法規則で「エラー」を使用できることがわかりました。したがって、エラーが発生した場合、パーサーは現在の行を破棄し、次の行から解析を再開する必要があります。これを達成するための bison マニュアルの例は、次のようになります。

stmts:
      exp
      |stmts exp
      | error '\n'

しかし、私はそれを使用できません。flex がスキャナーで '\n' を無視するようにしなければならなかったため、式が 1 行で表現されるように制限されなくなりました。式の終わりを示す特殊文字 (つまりセミコロン) がなく、「改行」トークンがない場合、エラーが発生したときにパーサーが次の行まで解析を続行するにはどうすればよいですか?

ありがとう..

4

1 に答える 1

7

例で使用されているマーカーを削除したので、同等の効果を得るにはスタントを引く必要があります。

私はあなたがこれを使うことができると思います:

stmts:
      exp
    | stmts exp
    | error { eat_to_newline(); }

eat_to_newline()保存されたトークンを破棄して次の改行まで読み取るように調整するスキャナー(ソースファイル)の関数はどこにありますか。

extern void eat_to_newline(void);

void eat_to_newline(void)
{
    int c;
    while ((c = getchar()) != EOF && c != '\n')
        ;
}

おそらくそれよりも少し複雑にする必要がありますが、それよりもそれほど複雑ではありません。を呼び出した後、使用する必要があるかもしれませんyyerrok;(そして、コメントが私に思い出させるように) 。yyclearin;eat_to_newline()

于 2012-10-27T04:07:41.803 に答える