次: Action Features, 前: Lexical, 上: Interface
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)
を生成した場合には、アクションからのみ参照可能な局所変数になります。