Next: , Previous: Lexical, Up: Interface


4.3 エラー報告関数yyerror

Bison構文解析器は、文法規則に適合しないトークンを読むたびに、 構文解析エラー(parse error)すなわち文法エラー(syntax error)を 検出します。文法中のアクションは、マクロYYERRORを使って、 明示的にエラーを示せます (see Special Features for Use in Actions)。

Bison構文解析器は、yyerrorという名前の関数を使って、 エラーを報告するようになっています。 事前に用意が必要な この関数は、文法エラーが発生するたびに、1個の引数をともなって、 yyparseから呼び出されます。 構文解析エラーに対して、引数の文字列は通常"parse error"です。

Bison定義部(see The Bison Declarations Section)で、 マクロYYERROR_VERBOSEを定義すると、 "parse error"の代わりに、 エラーを詳細に報告する文字列が用意されます。 マクロYYERROR_VERBOSEの定義はなんでもかまいません。

構文解析器は、もう1種類のエラーであるスタックオーバーフローを検出する 可能性があります。これは、入力がきわめて深い入れ子からなっていると 起こることがあります。Bison構文解析器は自動的にスタックの限界を大きく拡張し ているので、スタックオーバーフローはめったに起きません。 しかし、もしスタックオーバーフローが起きれば、 "parser stack overflow"という 文字列の引数をともなって、yyerrorが呼び出されます。

単純なプログラムでは、次の例のようにyyerrorを定義できます。

     yyerror (s)
          char *s;
     {
       fprintf (stderr, "%s\n", s);
     }

yyerrorから戻った後、yyparseは、 適切なエラー回復文法規則(see Error Recovery)があれば、 エラーからの回復を試みます。 もし、回復が不可能ならば、yyparseは即座に1を返します。

変数yynerrsには、それまでに出くわした文法エラーの数が記憶されています。 通常、この変数は広域変数です。 しかし、再入可能な構文解析器(see A Pure (Reentrant) Parser) を生成した場合には、アクションからのみ参照可能な局所変数になります。