Yacc Error Messages |
A nice compiler gives the user meaningful error messages. For example, not much information is conveyed by the following message:
syntax error
If we track the line number in lex then we can at least give the user a line number:
void yyerror(char *s) {
fprintf(stderr, "line %d: %s\n", yylineno, s);
}
When yacc discovers a parsing error the default action is to call yyerror and then
return from yylex with a return value of one. A more graceful action flushes the input
stream to a statement delimiter and continues to scan:
stmt:
';'
| expr ';'
| PRINT expr ';'
| VARIABLE '=' expr ';
| WHILE '(' expr ')' stmt
| IF '(' expr ')' stmt %prec IFX
| IF '(' expr ')' stmt ELSE stmt
| '{' stmt_list '}'
| error ';'
| error '}'
;
The error token is a special feature of yacc that will match all input until the
token following error is found. For this example, when yacc detects an error in a
statement it will call yyerror, flush input up to the next semicolon or brace, and
resume scanning.