Next: , Previous: Infix Calc, Up: Examples


2.3 単純なエラー回復

今まで、本書では、エラー回復(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)。 yyerrokyyerrorの違いに注意してください。

この形式のエラー回復は、構文エラーを扱います。 他の種類のエラーもあります。 たとえば、0による除算は、例外シグナルを発生し、通常は致命的です。 実際の電卓プログラムは、このシグナルをつかまえて、longjmpを使って mainに戻り、入力行の構文解析を続ける必要があります。 さらに、現在の入力行の残りは破棄されるべきです。 しかし、これらの問題は、Bisonのプログラムに固有の問題ではないので、 本書では解説しません。