私は現在、Flex+Bison を使用して小さなコンパイラを作成しようとしていますが、エラー処理をどうするか、特にすべてを適合させる方法について、ちょっと迷っています。議論の動機付けとして、私が文字列リテラルに使用している次のレクサー フラグメントを検討してください。
["] { BEGIN(STRING_LITERAL); init_string_buffer(); }
<STRING_LITERAL>{
\\\\ { add_char_to_buffer('\\'); }
\\\" { add_char_to_buffer('\"'); }
\\. { /*Invalid escape. How do I treat this error?*/ }
["] { BEGIN(INITIAL); yylval = get_string_buffer(); return TK_STRING; }
}
無効なエスケープがある状況をどのように処理しますか? 現在、エラーメッセージを出力して呼び出しているだけですexit
が、可能であれば、続行してファイルごとに複数のエラーを検出できるようにしたいと考えています。
私の質問:
- エラー メッセージを出力するには、どの関数を使用しますか? 後で bison が予想するのと同じ yyerror ですか? lexer と parser 用に別々のファイルがある場合、yyerror の定義はどこに置くのですか?
- アクションからどのトークン コードを返す必要がありますか? 「ファイルの終わり」の0?特別な TK_INVALID_STRING トークンですか?
- 字句エラー (無効なリテラル、不要な句読点など) の後、パーサーが解析を続行できるようにするにはどうすればよいですか?