[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
2.3 Simple Error Recovery
Up to this point, this manual has not addressed the issue of error
recovery—how to continue parsing after the parser detects a syntax
error. All we have handled is error reporting with yyerror
.
Recall that by default yyparse
returns after calling
yyerror
. This means that an erroneous input line causes the
calculator program to exit. Now we show how to rectify this deficiency.
The Bison language itself includes the reserved word error
, which
may be included in the grammar rules. In the example below it has
been added to one of the alternatives for line
:
line: '\n' | exp '\n' { printf ("\t%.10g\n", $1); } | error '\n' { yyerrok; } ; |
This addition to the grammar allows for simple error recovery in the
event of a syntax error. If an expression that cannot be evaluated is
read, the error will be recognized by the third rule for line
,
and parsing will continue. (The yyerror
function is still called
upon to print its message as well.) The action executes the statement
yyerrok
, a macro defined automatically by Bison; its meaning is
that error recovery is complete (see section Error Recovery). Note the
difference between yyerrok
and yyerror
; neither one is a
misprint.
This form of error recovery deals with syntax errors. There are other
kinds of errors; for example, division by zero, which raises an exception
signal that is normally fatal. A real calculator program must handle this
signal and use longjmp
to return to main
and resume parsing
input lines; it would also have to discard the rest of the current line of
input. We won't discuss this issue further because it is not specific to
Bison programs.