yacc.c: add custom error message generation

When parse.error is custom, let users define a yyreport_syntax_error
function, and use it.

* data/skeletons/bison.m4 (b4_error_verbose_if): Accept 'custom'.
* data/skeletons/yacc.c: Implement it.
* examples/c/calc/calc.y: Experiment with it.
This commit is contained in:
Akim Demaille
2020-01-03 09:50:09 +01:00
parent 5b883180e6
commit cda1934606
3 changed files with 40 additions and 3 deletions

View File

@@ -9,6 +9,7 @@
%define api.header.include {"calc.h"}
%define api.value.type union /* Generate YYSTYPE from these types: */
%define parse.error custom
%token <double> NUM "number"
%type <double> expr term fact
@@ -51,6 +52,28 @@ fact:
%%
int
yyreport_syntax_error (const yyparse_context_t *ctx)
{
enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 10 };
/* Arguments of yyformat: reported tokens (one for the "unexpected",
one per "expected"). */
int arg[YYERROR_VERBOSE_ARGS_MAXIMUM];
int n = yysyntax_error_arguments (ctx, arg, sizeof arg / sizeof *arg);
if (n == -2)
return 2;
fprintf (stderr, "SYNTAX ERROR on token [%s]", yysymbol_name (arg[0]));
if (1 < n)
{
fprintf (stderr, " (expected:");
for (int i = 1; i < n; ++i)
fprintf (stderr, " [%s]", yysymbol_name (arg[i]));
fprintf (stderr, ")");
}
fprintf (stderr, "\n");
return 0;
}
int
yylex (void)
{