| [ < ] | [ > ] | [ << ] | [ 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.
