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