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 parse 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.