diff --git a/NEWS b/NEWS index de8cfd0a..062efd83 100644 --- a/NEWS +++ b/NEWS @@ -39,20 +39,30 @@ GNU Bison NEWS int yyreport_syntax_error (const yypcontext_t *ctx) { - enum { ARGMAX = 10 }; - int arg[ARGMAX]; - int n = yy_syntax_error_arguments (ctx, arg, ARGMAX); - if (n == -2) - return 2; // Memory exhausted. + int res = 0; YY_LOCATION_PRINT (stderr, *yypcontext_location (ctx)); fprintf (stderr, ": syntax error"); - for (int i = 1; i < n; ++i) - fprintf (stderr, " %s %s", - i == 1 ? "expected" : "or", yysymbol_name (arg[i])); - if (n) - fprintf (stderr, " before %s", yysymbol_name (arg[0])); + // Report the tokens expected at this point. + { + enum { TOKENMAX = 10 }; + yysymbol_type_t expected[TOKENMAX]; + int n = yyexpected_tokens (ctx, expected, TOKENMAX); + if (n < 0) + // Forward errors to yyparse. + res = n; + else + for (int i = 0; i < n; ++i) + fprintf (stderr, "%s %s", + i == 0 ? ": expected" : " or", yysymbol_name (expected[i])); + } + // Report the unexpected token. + { + yysymbol_type_t lookahead = yypcontext_token (ctx); + if (lookahead != YYSYMBOL_YYEMPTY) + fprintf (stderr, " before %s", yysymbol_name (lookahead)); + } fprintf (stderr, "\n"); - return 0; + return res; } **** Token aliases internationalization diff --git a/examples/c/bistromathic/parse.y b/examples/c/bistromathic/parse.y index 74f4d3f7..9b8fb76f 100644 --- a/examples/c/bistromathic/parse.y +++ b/examples/c/bistromathic/parse.y @@ -287,6 +287,7 @@ yyreport_syntax_error (const yypcontext_t *ctx) int res = 0; YY_LOCATION_PRINT (stderr, *yypcontext_location (ctx)); fprintf (stderr, ": syntax error"); + // Report the tokens expected at this point. { enum { TOKENMAX = 10 }; yysymbol_type_t expected[TOKENMAX]; @@ -299,9 +300,10 @@ yyreport_syntax_error (const yypcontext_t *ctx) fprintf (stderr, "%s %s", i == 0 ? ": expected" : " or", yysymbol_name (expected[i])); } + // Report the unexpected token. { yysymbol_type_t lookahead = yypcontext_token (ctx); - if (lookahead != YYEMPTY) + if (lookahead != YYSYMBOL_YYEMPTY) fprintf (stderr, " before %s", yysymbol_name (lookahead)); } fprintf (stderr, "\n"); diff --git a/tests/local.at b/tests/local.at index a6b0c99c..c34c2b1b 100644 --- a/tests/local.at +++ b/tests/local.at @@ -634,7 +634,7 @@ yyreport_syntax_error (const yypcontext_t *ctx]AT_PARAM_IF([, AT_PARSE_PARAMS])[ fprintf (stderr, "syntax error"); { yysymbol_type_t la = yypcontext_token (ctx); - if (la != YYEMPTY) + if (la != YYSYMBOL_YYEMPTY) fprintf (stderr, " on token [%s]", yysymbol_name (la)); } { @@ -642,9 +642,9 @@ yyreport_syntax_error (const yypcontext_t *ctx]AT_PARAM_IF([, AT_PARSE_PARAMS])[ yysymbol_type_t expected[TOKENMAX]; int n = yyexpected_tokens (ctx, expected, TOKENMAX); /* Forward errors to yyparse. */ - if (n < 0) + if (n <= 0) res = n; - else if (0 < n) + else { fprintf (stderr, " (expected:"); for (int i = 0; i < n; ++i)