Next: Multi-function Calc, Previous: Infix Calc, Up: Examples
今まで、本書では、エラー回復(error recovery)、
つまり、構文エラーを検出した後で構文解析を続ける方法については
言及していませんでした。
今までに扱ったことは、yyerror
を使ってエラーを報告することだけでした。
yyerror
を呼び出した後で、特に指定しないとyyparse
は
処理を終わることを思い出してください。
つまり、エラーを含む入力行が、電卓プログラムを終了させます。
この欠陥をどのように改善するか示しましょう。
Bison言語の文法規則には、予約語error
があります。
次の例では、line
に対する選択肢群にerror
を追加する
方法を示します。
line: '\n' | exp '\n' { printf ("\t%.10g\n", $1); } | error '\n' { yyerrok; } ;
文法へのこの追加によって、構文解析エラーが発生した場合に、
簡単なエラー回復が可能になります。
評価不可能な式が読み込まれると、
line
に対する第3の規則によってエラーが認識され、
構文解析が続けられます。
この場合にも、関数yyerror
は呼び出され、
メッセージを表示します。
アクションは、
Bisonによって自動的に定義されるマクロであるyyerrok
文を実行します。
これはエラー回復の完了を意味します(see Error Recovery)。
yyerrok
とyyerror
の違いに注意してください。
この形式のエラー回復は、構文エラーを扱います。
他の種類のエラーもあります。
たとえば、0による除算は、例外シグナルを発生し、通常は致命的です。
実際の電卓プログラムは、このシグナルをつかまえて、longjmp
を使って
main
に戻り、入力行の構文解析を続ける必要があります。
さらに、現在の入力行の残りは破棄されるべきです。
しかし、これらの問題は、Bisonのプログラムに固有の問題ではないので、
本書では解説しません。