From 086506bf239ad331934e77105cb611dd841585c1 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sun, 29 Mar 2020 11:51:31 +0200 Subject: [PATCH] glr.c, yacc.c: propagate yysymbol_type_t Now that yacc.c and glr.c both know yysymbol_type_t, convert the common routines. * data/skeletons/c.m4 (yydestruct, yy_symbol_value_print) (yy_symbol_print): Use yysymbol_type_t instead of int. * data/skeletons/glr.c: Use yySymbol where appropriate. * data/skeletons/yacc.c (YY_ACCESSING_SYMBOL): New wrapper around yystos. Use it. * tests/local.at (yyreport_syntax_error): Use yysymbol_type_t where appropriate. --- data/skeletons/c.m4 | 6 +++--- data/skeletons/glr.c | 6 +++--- data/skeletons/yacc.c | 13 ++++++++----- tests/local.at | 4 ++-- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/data/skeletons/c.m4 b/data/skeletons/c.m4 index d0aade36..37891363 100644 --- a/data/skeletons/c.m4 +++ b/data/skeletons/c.m4 @@ -620,7 +620,7 @@ m4_define_default([b4_yydestruct_define], static void yydestruct (const char *yymsg, - int yytype, YYSTYPE *yyvaluep]b4_locations_if(dnl + yysymbol_type_t yytype, YYSTYPE *yyvaluep]b4_locations_if(dnl [[, YYLTYPE *yylocationp]])[]b4_user_formals[) { ]b4_parse_param_use([yyvaluep], [yylocationp])dnl @@ -646,7 +646,7 @@ m4_define_default([b4_yy_symbol_print_define], static void yy_symbol_value_print (FILE *yyo, - int yytype, YYSTYPE const * const yyvaluep]b4_locations_if(dnl + yysymbol_type_t yytype, YYSTYPE const * const yyvaluep]b4_locations_if(dnl [[, YYLTYPE const * const yylocationp]])[]b4_user_formals[) { FILE *yyoutput = yyo; @@ -674,7 +674,7 @@ b4_percent_code_get([[post-printer]])dnl static void yy_symbol_print (FILE *yyo, - int yytype, YYSTYPE const * const yyvaluep]b4_locations_if(dnl + yysymbol_type_t yytype, YYSTYPE const * const yyvaluep]b4_locations_if(dnl [[, YYLTYPE const * const yylocationp]])[]b4_user_formals[) { YYFPRINTF (yyo, "%s %s (", diff --git a/data/skeletons/glr.c b/data/skeletons/glr.c index 7745ae0d..393f0560 100644 --- a/data/skeletons/glr.c +++ b/data/skeletons/glr.c @@ -1482,7 +1482,7 @@ yyglrReduce (yyGLRStack* yystackp, ptrdiff_t yyk, yyRuleNum yyrule, YY_CAST (long, yyk), yyrule - 1, yyrline[yyrule - 1])); if (yyflag != yyok) return yyflag; - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyrule], &yysval, &yyloc); + YY_SYMBOL_PRINT ("-> $$ =", yylhsNonterm (yyrule), &yysval, &yyloc); yyglrShift (yystackp, yyk, yyLRgotoState (yystackp->yytops.yystates[yyk]->yylrState, yylhsNonterm (yyrule)), @@ -2131,10 +2131,10 @@ static int yyreport_syntax_error (const yyGLRStack* yystackp]b4_user_formals[); /* The token type of the lookahead of this context. */ -static int +static yySymbol yyparse_context_token (const yyGLRStack *yystackp) YY_ATTRIBUTE_UNUSED; -static int +static yySymbol yyparse_context_token (const yyGLRStack *yystackp) { YYUSE (yystackp); diff --git a/data/skeletons/yacc.c b/data/skeletons/yacc.c index 5505b982..d1460b4a 100644 --- a/data/skeletons/yacc.c +++ b/data/skeletons/yacc.c @@ -649,6 +649,9 @@ static const ]b4_int_type_for([b4_translate])[ yytranslate[] = [[YYRLINE[YYN] -- Source line where rule number YYN was defined.]])[ #endif +/** Accessing symbol of state STATE. */ +#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_type_t, yystos[State]) + #if ]b4_parse_error_case([simple], [b4_api_PREFIX[DEBUG || ]b4_token_table_flag], [[1]])[ /* The user-facing name of the symbol whose (internal) number is YYSYMBOL. No bounds checking. */ @@ -819,7 +822,7 @@ yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,]b4_locations_if([[ YYLTYPE * { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, - yystos[+yyssp[yyi + 1 - yynrhs]], + YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), &]b4_rhs_value(yynrhs, yyi + 1)[ ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl b4_user_args[); @@ -1866,7 +1869,7 @@ yyreduce: case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_type_t, yyr1[yyn]), &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; @@ -2018,7 +2021,7 @@ yyerrlab1: ]b4_locations_if([[ yyerror_range[1] = *yylsp;]])[ yydestruct ("Error: popping", - yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[); + YY_ACCESSING_SYMBOL (yystate), yyvsp]b4_locations_if([, yylsp])[]b4_user_args[); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); @@ -2039,7 +2042,7 @@ yyerrlab1: *++yylsp = yyloc;]])[ /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); yystate = yyn; goto yynewstate; @@ -2091,7 +2094,7 @@ yyreturn: while (yyssp != yyss) { yydestruct ("Cleanup: popping", - yystos[+*yyssp], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[); + YY_ACCESSING_SYMBOL (+*yyssp), yyvsp]b4_locations_if([, yylsp])[]b4_user_args[); YYPOPSTACK (1); } #ifndef yyoverflow diff --git a/tests/local.at b/tests/local.at index fdb715c9..43a51f8b 100644 --- a/tests/local.at +++ b/tests/local.at @@ -633,13 +633,13 @@ yyreport_syntax_error (const yyparse_context_t *ctx]AT_PARAM_IF([, AT_PARSE_PARA fprintf (stderr, ": ");]])[ fprintf (stderr, "syntax error"); { - int la = yyparse_context_token (ctx); + yysymbol_type_t la = yyparse_context_token (ctx); if (la != YYEMPTY) fprintf (stderr, " on token [%s]", yysymbol_name (la)); } { enum { TOKENMAX = 10 }; - int expected[TOKENMAX]; + yysymbol_type_t expected[TOKENMAX]; int n = yyexpected_tokens (ctx, expected, TOKENMAX); /* Forward errors to yyparse. */ if (n < 0)