次: Multi-function Calc, 前: Infix Calc, 上: 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のプログラムに固有の問題ではないので、
本書では解説しません。