From 7122d747cf37ce7121958fd1ae43e663fa94aa17 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 3 Jan 2020 12:03:37 +0100 Subject: [PATCH] yacc.c: no longer support YYERROR_VERBOSE Supporting YYERROR_VERBOSE via cpp is a nuisance: m4 is in charge of handling alternatives. When adding more options for %define parse.error, supporting both CPP and M4 is too complex. Anyway, YYERROR_VERBOSE was deprecated long ago. * data/skeletons/yacc.c: Use m4 only to handle verbose/simple error messages. --- data/skeletons/yacc.c | 50 ++++++++++++++++--------------------------- tests/conflicts.at | 3 ++- 2 files changed, 21 insertions(+), 32 deletions(-) diff --git a/data/skeletons/yacc.c b/data/skeletons/yacc.c index 242cca4a..a2f93f17 100644 --- a/data/skeletons/yacc.c +++ b/data/skeletons/yacc.c @@ -348,14 +348,6 @@ m4_if(b4_api_prefix, [yy], [], ]b4_cast_define[ ]b4_null_define[ -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[ -#endif - ]b4_header_include_if([[#include ]b4_percent_define_get([[api.header.include]])], [m4_ifval(m4_quote(b4_spec_header_file), [/* Use api.header.include to #include this header @@ -437,7 +429,7 @@ typedef int yy_state_fast_t; ]], [[#define YY_ASSERT(E) ((void) (0 && (E)))]])[ -#if ]b4_lac_if([[1]], [[! defined yyoverflow || YYERROR_VERBOSE]])[ +#if ]b4_lac_if([[1]], [b4_error_verbose_if([[1]], [[!defined yyoverflow]])])[ /* The parser invokes alloca or malloc; define the necessary symbols. */]dnl b4_push_if([], [b4_lac_if([], [[ @@ -504,8 +496,7 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif]b4_lac_if([[ # define YYCOPY_NEEDED 1]])[ -#endif]b4_lac_if([], [[ /* ! defined yyoverflow || YYERROR_VERBOSE */]])[ - +#endif]b4_lac_if([], [b4_error_verbose_if([], [[/* !defined yyoverflow */]])])[ #if (! defined yyoverflow \ && (! defined __cplusplus \ @@ -611,7 +602,7 @@ static const ]b4_int_type_for([b4_translate])[ yytranslate[] = [[YYRLINE[YYN] -- Source line where rule number YYN was defined.]])[ #endif -#if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[ +#if ]b4_error_verbose_if([[1]], [b4_api_PREFIX[DEBUG || ]b4_token_table_flag])[ /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = @@ -1039,9 +1030,8 @@ yy_lac (yy_state_t *yyesa, yy_state_t **yyes, }]])[ -#if YYERROR_VERBOSE - -# ifndef yystrlen +]m4_case(b4_percent_define_get([parse.error]), [verbose], +[[# ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S))) # else @@ -1287,7 +1277,7 @@ yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg, } return 0; } -#endif /* YYERROR_VERBOSE */ +]])[ ]b4_yydestruct_define[ @@ -1428,12 +1418,11 @@ b4_function_define([[yyparse]], [[int]], b4_parse_param)[ YYSTYPE yyval;]b4_locations_if([[ YYLTYPE yyloc;]])[ -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ +]m4_case(b4_percent_define_get([parse.error]), [verbose], +[[ /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; - YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf; -#endif + YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf;]])[ #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)]b4_locations_if([, yylsp -= (N)])[) @@ -1750,10 +1739,11 @@ yyerrlab: if (!yyerrstatus) { ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (]b4_yyerror_args[YY_("syntax error")); -#else -# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \]b4_lac_if([[ +]m4_case(b4_percent_define_get([parse.error]), + [simple], +[[ yyerror (]b4_yyerror_args[YY_("syntax error"));]], + [verbose], +[[# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \]b4_lac_if([[ yyesa, &yyes, &yyes_capacity, \]])[ yyssp, yytoken) { @@ -1785,8 +1775,7 @@ yyerrlab: if (yysyntax_error_status == 2) goto yyexhaustedlab; } -# undef YYSYNTAX_ERROR -#endif +# undef YYSYNTAX_ERROR]])[ } ]b4_locations_if([[ yyerror_range[1] = yylloc;]])[ @@ -1902,7 +1891,7 @@ yyabortlab: goto yyreturn; -#if ]b4_lac_if([[1]], [[!defined yyoverflow || YYERROR_VERBOSE]])[ +#if ]b4_lac_if([[1]], [b4_error_verbose_if([[1]], [[!defined yyoverflow]])])[ /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ @@ -1948,10 +1937,9 @@ yyreturn: | yypushreturn -- ask for the next token. | `-----------------------------------------*/ yypushreturn:]])[ -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif +]m4_case(b4_percent_define_get([parse.error]), [verbose], +[[ if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg);]])[ return yyresult; } ]b4_epilogue[]dnl diff --git a/tests/conflicts.at b/tests/conflicts.at index 92050fbe..1f918fd6 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -309,7 +309,6 @@ AT_DATA_GRAMMAR([input.y], #include #include -#define YYERROR_VERBOSE 1 ]AT_YYERROR_DEFINE[ /* The current argument. */ static const char *input; @@ -324,6 +323,8 @@ yylex (void) %} +%define parse.error verbose + %nonassoc '<' '>' %%