Submitted by Valentin in https://github.com/akimd/bison/pull/46. Thanks a lot!
I have added a few TODO I spotted when reading your commit. Cheers! commit 38abe1e1b7d1dea2aa59de63695fd8c0d8686205 Author: Valentin Tolmer <[email protected]> Date: Thu Sep 3 18:24:33 2020 +0200 glr2.cc: avoid warnings about printf and shadowing * data/skeletons/glr2.cc: Migrate from using printf to std::cerr & co. Since the yyGLRStack has the user params, no need to pass them around. diff --git a/TODO b/TODO index 4fea8c81..5e0149cd 100644 --- a/TODO +++ b/TODO @@ -178,6 +178,14 @@ We should use clean C++ code. StrongIndexAlias should be in the parser's namespace. Possibly even an inner class. +*** Coding style +Move to our coding conventions. In particular names such as yy_glr_stack, +not yyGLRStack. + +*** yydebug +It should be a member of the parser object, see lalr1.cc. Let the parser +object decide what the debug stream is, rather than open coding std::cerr. +And use YYCDEBUG rather than YY_DEBUG_STREAM. * Chains ** Unit rules / Injection rules (Akim Demaille) diff --git a/data/skeletons/glr2.cc b/data/skeletons/glr2.cc index fdd5833b..81ee2299 100644 --- a/data/skeletons/glr2.cc +++ b/data/skeletons/glr2.cc @@ -62,17 +62,6 @@ m4_define([b4_parser_class], # Save the parse parameters. m4_define([b4_parse_param_orig], m4_defn([b4_parse_param])) -# b4_parse_param_wrap -# ------------------- -# New ones. -m4_ifset([b4_parse_param], -[m4_define([b4_parse_param_wrap], - [[b4_namespace_ref::b4_parser_class[& yyparser], [[yyparser]]],] -m4_defn([b4_parse_param]))], -[m4_define([b4_parse_param_wrap], - [[b4_namespace_ref::b4_parser_class[& yyparser], [[yyparser]]]]) -]) - # b4_yy_symbol_print_define # ------------------------- # Bypass the default implementation to generate the "yy_symbol_print" @@ -83,7 +72,7 @@ m4_define([b4_yy_symbol_print_define], `--------------------*/ static void -yy_symbol_print (FILE *, ]b4_namespace_ref::b4_parser_class[::symbol_kind_type yytoken, +yy_symbol_print (FILE *, ]b4_namespace_ref[::]b4_parser_class[& yyparser, ]b4_namespace_ref::b4_parser_class[::symbol_kind_type yytoken, const ]b4_namespace_ref::b4_parser_class[::semantic_type *yyvaluep]b4_locations_if([[, const ]b4_namespace_ref::b4_parser_class[::location_type *yylocationp]])[]b4_user_formals[) { @@ -101,7 +90,7 @@ m4_defn([b4_initial_action])]))])[ ]m4_append([b4_post_prologue], [b4_syncline([@oline@], [@ofile@])dnl [static void -yyerror (]b4_locations_if([[const ]b4_namespace_ref::b4_parser_class[::location_type *yylocationp, +yyerror (]b4_namespace_ref[::]b4_parser_class[& yyparser, ]b4_locations_if([[const ]b4_namespace_ref::b4_parser_class[::location_type *yylocationp, ]])[]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param), ])[const std::string& msg);]])[ @@ -148,6 +137,7 @@ b4_percent_code_get([[requires]])[ #include <algorithm> #include <cstddef> // ptrdiff_t #include <iostream> +#include <iomanip> #include <stdexcept> #include <stdint.h> #include <string> @@ -380,10 +370,6 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++], ]b4_cpp_guard_close([b4_spec_mapped_header_file])[ ]b4_output_end]) -# Let glr.c (and b4_shared_declarations) believe that the user -# arguments include the parser itself. -m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_wrap])) - ## ---------------- ## ## Default values. ## ## ---------------- ## @@ -420,15 +406,16 @@ m4_define([b4_user_formals_no_comma], # Optional effective arguments passed to yyerror: user args plus yylloc, and # a trailing comma. m4_define([b4_yyerror_args], -[b4_pure_if([b4_locations_if([yylocp, ])])dnl +[yyparser, b4_pure_if([b4_locations_if([yylocp, ])])dnl m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])]) + # b4_lyyerror_args # ---------------- # Same as above, but on the lookahead, hence &yylloc instead of yylocp. m4_define([b4_lyyerror_args], -[b4_pure_if([b4_locations_if([&yylloc, ])])dnl +[yyparser, []b4_pure_if([b4_locations_if([&yylloc, ])])dnl m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])]) @@ -441,7 +428,7 @@ m4_define([b4_pure_args], # b4_lpure_args # ------------- -# Same as above, but on the lookahead, hence &yylloc instead of yylocp. +# Same as above, but on the lookahead, hence &yylloc instead of yylocp. This is used only inside yyGLRStack, so there's no need to explicitly pass yyparser. m4_define([b4_lpure_args], [b4_pure_if([b4_locations_if([, &yylloc])])[]b4_user_args]) @@ -771,17 +758,9 @@ typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG; #if ]b4_api_PREFIX[DEBUG -# ifndef YYFPRINTF -# define YYFPRINTF fprintf -# endif - ]b4_yy_location_print_define[ -# define YYDPRINTF(Args) \ - do { \ - if (yydebug) \ - YYFPRINTF Args; \ - } while (0) +#define YY_DEBUG_STREAM if (!yydebug) {} else std::cerr ]b4_yy_symbol_print_define[ @@ -789,9 +768,9 @@ typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG; do { \ if (yydebug) \ { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[); \ - YYFPRINTF (stderr, "\n"); \ + std::cerr << Title << ' '; \ + yy_symbol_print (stderr, yyparser, Type, Value]b4_locuser_args([Location])[);\ + std::cerr << '\n'; \ } \ } while (0) @@ -807,7 +786,7 @@ static void yypdumpstack (struct yyGLRStack* yystackp) #else /* !]b4_api_PREFIX[DEBUG */ -# define YYDPRINTF(Args) +# define YY_DEBUG_STREAM if (true) {} else std::cerr # define YY_SYMBOL_PRINT(Title, Type, Value, Location) #endif /* !]b4_api_PREFIX[DEBUG */ @@ -867,10 +846,10 @@ yyStateSetIndex yycreateStateSetIndex(std::ptrdiff_t value) { ]b4_table_value_equals([[table]], [[Yytable_value]], [b4_table_ninf], [YYTABLE_NINF])[ ]m4_define([b4_yygetToken_call], - [[yygetToken (&yychar][]b4_pure_if([, yystackp])[]b4_user_args[)]])[ + [[yygetToken (&yychar, yyparser][]b4_pure_if([, yystackp])[]b4_user_args[)]])[ static inline ]b4_namespace_ref::b4_parser_class[::symbol_kind_type -yygetToken (int *yycharp][]b4_pure_if([, yyGLRStack* yystackp])[]b4_user_formals[); +yygetToken (int *yycharp, ]b4_namespace_ref[::]b4_parser_class[& yyparser][]b4_pure_if([, yyGLRStack* yystackp])[]b4_user_formals[); static inline bool yyisShiftAction (int yyaction) @@ -968,7 +947,7 @@ class yyGLRState { } void - destroy (char const *yymsg]b4_user_formals[); + destroy (char const *yymsg, ]b4_namespace_ref[::]b4_parser_class[& yyparser]b4_user_formals[); /* DEBUGGING ONLY */ #if ]b4_api_PREFIX[DEBUG @@ -977,10 +956,9 @@ class yyGLRState { if (pred() != YY_NULLPTR) { pred()->yy_yypstack(); - YYFPRINTF (stderr, " -> "); + std::cerr << " -> "; } - YYFPRINTF (stderr, "%d@@%lu", yylrState, - (unsigned long) yyposn); + std::cerr << yylrState << "@@" << yyposn; } #endif @@ -1075,7 +1053,7 @@ class yyGLRStateSet { if (yylastDeleted == YY_NULLPTR || !yystates.empty()) return; yystates.push_back(yylastDeleted); - YYDPRINTF ((stderr, "Restoring last deleted stack as stack #0.\n")); + YY_DEBUG_STREAM << "Restoring last deleted stack as stack #0.\n"; clearLastDeleted(); } @@ -1092,7 +1070,7 @@ class yyGLRStateSet { { if (i == j) { - YYDPRINTF ((stderr, "Removing dead stacks.\n")); + YY_DEBUG_STREAM << "Removing dead stacks.\n"; } newsize -= 1; } @@ -1107,7 +1085,7 @@ class yyGLRStateSet { yylookaheadNeeds[j] = yylookaheadNeeds[i]; if (j != i) { - YYDPRINTF ((stderr, "Rename stack %zu -> %zu.\n", i, j)); + YY_DEBUG_STREAM << "Rename stack " << i << " -> " << j << ".\n"; } j += 1; } @@ -1394,7 +1372,7 @@ void yySemanticOption::setNext(const yySemanticOption* s) { yynext = s ? asItem(this) - asItem(s) : 0; } -void yyGLRState::destroy (char const *yymsg]b4_user_formals[) +void yyGLRState::destroy (char const *yymsg, ]b4_namespace_ref[::]b4_parser_class[& yyparser]b4_user_formals[) { if (yyresolved) yyparser.yy_destroy_ (yymsg, YY_CAST (]b4_namespace_ref::b4_parser_class[::symbol_kind_type, yystos[yylrState]), @@ -1405,9 +1383,9 @@ void yyGLRState::destroy (char const *yymsg]b4_user_formals[) if (yydebug) { if (firstVal() != YY_NULLPTR) - YYFPRINTF (stderr, "%s unresolved", yymsg); + std::cerr << yymsg << " unresolved"; else - YYFPRINTF (stderr, "%s incomplete", yymsg); + std::cerr << yymsg << " incomplete"; YY_SYMBOL_PRINT ("", YY_CAST (]b4_namespace_ref::b4_parser_class[::symbol_kind_type, yystos[yylrState]), YY_NULLPTR, &yyloc); } #endif @@ -1418,7 +1396,7 @@ void yyGLRState::destroy (char const *yymsg]b4_user_formals[) yyGLRState *yyrh = yyoption->state(); for (int yyn = yyrhsLength (yyoption->yyrule); yyn > 0; yyn -= 1) { - yyrh->destroy (yymsg]b4_user_args[); + yyrh->destroy (yymsg, yyparser]b4_user_args[); yyrh = yyrh->pred(); } } @@ -1656,6 +1634,7 @@ struct yyStateStack { yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1) { yyGLRState* s = yyvsp[yylow0].getState().pred(); + YYASSERT(s != YY_NULLPTR); for (int i = yylow0-1; i >= yylow1; i -= 1, s = s->pred()) { yyGLRState& yys = yyvsp[i].getState(); @@ -1689,28 +1668,27 @@ struct yyStateStack { inline void yy_reduce_print (bool yynormal, yyGLRStackItem* yyvsp, yyStateSetIndex yyk, - yyRuleNum yyrule]b4_user_formals[) + yyRuleNum yyrule, ]b4_namespace_ref[::]b4_parser_class[& yyparser]b4_user_formals[) { int yynrhs = yyrhsLength (yyrule);]b4_locations_if([ int yylow = 1;])[ int yyi; - YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n", - (unsigned long) yyk.get(), yyrule - 1, - (unsigned long) yyrline[yyrule]); + std::cerr << "Reducing stack " << yyk.get() << " by rule " << yyrule - 1 << " (line " << yyrline[yyrule] << "):\n"; if (! yynormal) yyfillin (yyvsp, 1, -yynrhs); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { - YYFPRINTF (stderr, " $%d = ", yyi + 1); + std::cerr << " $" << yyi + 1 << " = "; yy_symbol_print (stderr, + yyparser, YY_CAST (]b4_namespace_ref::b4_parser_class[::symbol_kind_type, yystos[yyvsp[yyi - yynrhs + 1].getState().yylrState]), &yyvsp[yyi - yynrhs + 1].getState().semanticVal()]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl b4_user_args[); if (!yyvsp[yyi - yynrhs + 1].getState().yyresolved) - YYFPRINTF (stderr, " (unresolved)"); - YYFPRINTF (stderr, "\n"); + std::cerr << " (unresolved)"; + std::cerr << '\n'; } } @@ -1724,33 +1702,30 @@ struct yyStateStack { for (size_t yyi = 0; yyi < size(); ++yyi) { yyGLRStackItem& item = yyitems[yyi]; - YYFPRINTF (stderr, "%3zu. ", yyi); + std::cerr << std::setw(3) << yyi << ". "; if (item.isState()) { - YYFPRINTF (stderr, "Res: %d, LR State: %d, posn: %zu, pred: %td", - item.getState().yyresolved, item.getState().yylrState, - item.getState().yyposn, - YYINDEX(item.getState().pred())); + std::cerr << "Res: " << item.getState().yyresolved + << ", LR State: " << item.getState().yylrState + << ", posn: " << item.getState().yyposn + << ", pred: " << YYINDEX(item.getState().pred()); if (! item.getState().yyresolved) - YYFPRINTF (stderr, ", firstVal: %td", - YYINDEX(item.getState().firstVal())); + std::cerr << ", firstVal: " + << YYINDEX(item.getState().firstVal()); } else { - YYFPRINTF (stderr, "Option. rule: %d, state: %td, next: %td", - item.getOption().yyrule - 1, - YYINDEX(item.getOption().state()), - YYINDEX(item.getOption().next())); + std::cerr << "Option. rule: " << item.getOption().yyrule - 1 + << ", state: " << YYINDEX(item.getOption().state()) + << ", next: " << YYINDEX(item.getOption().next()); } - YYFPRINTF (stderr, "\n"); + std::cerr << '\n'; } - YYFPRINTF (stderr, "Tops:"); + std::cerr << "Tops:"; for (yyStateSetIndex yyi = yycreateStateSetIndex(0); yyi.uget() < numTops(); ++yyi) { - YYFPRINTF (stderr, "%lu: %td; ", - (unsigned long) yyi.get(), - YYINDEX(topAt(yyi))); + std::cerr << yyi.get() << ": " << YYINDEX(topAt(yyi)) << "; "; } - YYFPRINTF (stderr, "\n"); + std::cerr << '\n'; } #undef YYINDEX @@ -1758,18 +1733,18 @@ struct yyStateStack { YYRESULTTAG yyreportAmbiguity (yySemanticOption* yyx0, - yySemanticOption* yyx1]b4_pure_formals[) + yySemanticOption* yyx1, ]b4_namespace_ref[::]b4_parser_class[& yyparser]b4_pure_formals[) { YYUSE (yyx0); YYUSE (yyx1); #if ]b4_api_PREFIX[DEBUG - YYFPRINTF (stderr, "Ambiguity detected.\n"); - YYFPRINTF (stderr, "Option 1,\n"); + std::cerr << "Ambiguity detected.\n"; + std::cerr << "Option 1,\n"; yyreportTree (yyx0, 2); - YYFPRINTF (stderr, "\nOption 2,\n"); + std::cerr << "\nOption 2,\n"; yyreportTree (yyx1, 2); - YYFPRINTF (stderr, "\n"); + std::cerr << "\n"; #endif yyerror (]b4_yyerror_args[YY_("syntax is ambiguous")); @@ -1784,8 +1759,8 @@ struct yyStateStack { if (yyst != YY_NULLPTR) yyst->yy_yypstack(); else - YYFPRINTF (stderr, "<null>"); - YYFPRINTF (stderr, "\n"); + std::cerr << "<null>"; + std::cerr << "\n"; } #endif @@ -1809,7 +1784,7 @@ struct yyStateStack { #if ]b4_api_PREFIX[DEBUG void - yyreportTree (yySemanticOption* yyx, int yyindent) + yyreportTree (yySemanticOption* yyx, size_t yyindent) { int yynrhs = yyrhsLength (yyx->yyrule); yyGLRState* yystates[1 + YYMAXRHS]; @@ -1832,28 +1807,27 @@ struct yyStateStack { } std::string yylhs = ]b4_namespace_ref::b4_parser_class[::symbol_name (yylhsNonterm (yyx->yyrule)); + YYASSERT(yyx->state()); if (yyx->state()->yyposn < yystates[0]->yyposn + 1) - YYFPRINTF (stderr, "%*s%s -> <Rule %d, empty>\n", - yyindent, "", yylhs.c_str(), - yyx->yyrule - 1); + std::cerr << std::string(yyindent, ' ') << yylhs << " -> <Rule " + << yyx->yyrule - 1 << ", empty>\n"; else - YYFPRINTF (stderr, "%*s%s -> <Rule %d, tokens %zu .. %zu>\n", - yyindent, "", yylhs.c_str(), - yyx->yyrule - 1, yystates[0]->yyposn + 1, - yyx->state()->yyposn); + std::cerr << std::string(yyindent, ' ') << yylhs << " -> <Rule " + << yyx->yyrule - 1 << ", tokens " + << yystates[0]->yyposn + 1 << " .. " + << yyx->state()->yyposn << ">\n"; for (int yyi = 1; yyi <= yynrhs; yyi += 1) { if (yystates[yyi]->yyresolved) { std::string yysym = ]b4_namespace_ref::b4_parser_class[::symbol_name (YY_CAST (]b4_namespace_ref::b4_parser_class[::symbol_kind_type, yystos[yystates[yyi]->yylrState])); if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn) - YYFPRINTF (stderr, "%*s%s <empty>\n", yyindent+2, "", - yysym.c_str()); + std::cerr << std::string(yyindent + 2, ' ') << yysym + << " <empty>\n"; else - YYFPRINTF (stderr, "%*s%s <tokens %zu .. %zu>\n", yyindent+2, "", - yysym.c_str(), - yystates[yyi-1]->yyposn + 1, - yystates[yyi]->yyposn); + std::cerr << std::string(yyindent + 2, ' ') << yysym + << " <tokens " << yystates[yyi-1]->yyposn + 1 + << " .. " << yystates[yyi]->yyposn << ">\n"; } else yyreportTree (yystates[yyi]->firstVal(), @@ -1875,12 +1849,13 @@ struct yyStateStack { #define yystackp this struct yyGLRStack { - yyGLRStack(size_t yysize, ]b4_parse_param_decl[) + yyGLRStack(size_t yysize, ]b4_namespace_ref[::]b4_parser_class[& yyparser_yyarg]m4_ifset([b4_parse_param], [, b4_parse_param_decl])[) : yyerrState(0) , yystateStack(yysize) , yyerrcnt(0) , yyrawchar(0) - ,]b4_parse_param_cons[ + , yyparser(yyparser_yyarg)]m4_ifset([b4_parse_param], [ + , b4_parse_param_cons])[ {} ~yyGLRStack () @@ -1903,6 +1878,7 @@ struct yyGLRStack { YYLTYPE yyloc;]])[ ])[ YYJMP_BUF yyexception_buffer; + ]b4_namespace_ref[::]b4_parser_class[& yyparser; void yyreserveGlrStack() { if (yystateStack.yyexpandGLRStackIfNeeded ()) @@ -1916,7 +1892,7 @@ struct yyGLRStack { } _Noreturn void - yyFail (const char* yymsg]b4_pure_formals[) + yyFail (]b4_locations_if([YYLTYPE* yylocp, ])[const char* yymsg) { if (yymsg != YY_NULLPTR) yyerror (]b4_yyerror_args[yymsg); @@ -1955,7 +1931,7 @@ struct yyGLRStack { } #endif void - yyreportSyntaxError (]b4_user_formals_no_comma[) + yyreportSyntaxError () { if (yyerrState != 0) return; @@ -2065,7 +2041,7 @@ struct yyGLRStack { yylval, and yylloc are the syntactic category, semantic value, and location of the lookahead. */ void - yyrecoverSyntaxError (]b4_user_formals_no_comma[) + yyrecoverSyntaxError (]b4_locations_if([YYLTYPE* yylocp])[) { if (yyerrState == 3) /* We just shifted the error token and (perhaps) took some @@ -2075,13 +2051,12 @@ struct yyGLRStack { ]b4_namespace_ref::b4_parser_class[::symbol_kind_type yytoken; int yyj; if (yychar == ]b4_namespace_ref::b4_parser_class::token::b4_symbol(0, id)[) - yyFail (YY_NULLPTR][]b4_lpure_args[); + yyFail (]b4_locations_if([yylocp, ])[YY_NULLPTR); if (yychar != ]b4_namespace_ref::b4_parser_class::token::b4_symbol(-2, id)[) {]b4_locations_if([[ /* We throw away the lookahead, but the error range of the shifted error token must take it into account. */ yyGLRState *yys = firstTopState(); - yyGLRStackItem yyerror_range[3]; yyerror_range[1].getState().yyloc = yys->yyloc; yyerror_range[2].getState().yyloc = yylloc; YYLLOC_DEFAULT ((yys->yyloc), yyerror_range, 2);]])[ @@ -2105,7 +2080,7 @@ struct yyGLRStack { } if (!yystateStack.reduceToOneStack()) - yyFail (YY_NULLPTR][]b4_lpure_args[); + yyFail (]b4_locations_if([yylocp, ])[YY_NULLPTR); /* Now pop stack until we find a state that shifts the error token. */ yyerrState = 3; @@ -2134,23 +2109,23 @@ struct yyGLRStack { }]b4_locations_if([[ yyerror_range[1].getState().yyloc = yys->yyloc;]])[ if (yys->pred() != YY_NULLPTR) - yys->destroy ("Error: popping"]b4_user_args[); + yys->destroy ("Error: popping", yyparser]b4_user_args[); yystateStack.setFirstTop(yys->pred()); yystateStack.pop_back(); } if (firstTopState() == YY_NULLPTR) - yyFail (YY_NULLPTR][]b4_lpure_args[); + yyFail (]b4_locations_if([yylocp, ])[YY_NULLPTR); } YYRESULTTAG yyprocessOneStack (yyStateSetIndex yyk, - size_t yyposn]b4_pure_formals[) + size_t yyposn]b4_locations_if([, YYLTYPE* yylocp])[) { while (yystateStack.topAt(yyk) != YY_NULLPTR) { yyStateNum yystate = topState(yyk)->yylrState; - YYDPRINTF ((stderr, "Stack %zu Entering state %d\n", - yyk.get(), yystate)); + YY_DEBUG_STREAM << "Stack " << yyk.get() + << " Entering state " << yystate << '\n'; YYASSERT (yystate != YYFINAL); @@ -2159,19 +2134,16 @@ struct yyGLRStack { yyRuleNum yyrule = yydefaultAction (yystate); if (yyrule == 0) { - YYDPRINTF ((stderr, "Stack %zu dies.\n", - yyk.get())); + YY_DEBUG_STREAM << "Stack " << yyk.get() << " dies.\n"; yystateStack.yytops.yymarkStackDeleted (yyk); return yyok; } YYRESULTTAG yyflag = yyglrReduce (yyk, yyrule, - yyimmediate[yyrule]]b4_user_args[); + yyimmediate[yyrule]); if (yyflag == yyerr) { - YYDPRINTF ((stderr, - "Stack %zu dies " - "(predicate failure or explicit user error).\n", - yyk.get())); + YY_DEBUG_STREAM << "Stack " << yyk.get() << " dies " + "(predicate failure or explicit user error).\n"; yystateStack.yytops.yymarkStackDeleted (yyk); return yyok; } @@ -2188,19 +2160,17 @@ struct yyGLRStack { for (; *yyconflicts != 0; ++yyconflicts) { yyStateSetIndex yynewStack = yystateStack.yysplitStack (yyk); - YYDPRINTF ((stderr, "Splitting off stack %lu from %zu.\n", - (unsigned long) yynewStack.get(), - yyk.get())); + YY_DEBUG_STREAM << "Splitting off stack " << yynewStack.get() + << " from " << yyk.get(); YYRESULTTAG yyflag = yyglrReduce (yynewStack, *yyconflicts, - yyimmediate[*yyconflicts]]b4_user_args[); + yyimmediate[*yyconflicts]); if (yyflag == yyok) YYCHK (yyprocessOneStack (yynewStack, - yyposn]b4_pure_args[)); + yyposn]b4_locations_if([, yylocp])[)); else if (yyflag == yyerr) { - YYDPRINTF ((stderr, "Stack %zu dies.\n", - yynewStack.get())); + YY_DEBUG_STREAM << "Stack " << yynewStack.get() << " dies.\n"; yystateStack.yytops.yymarkStackDeleted (yynewStack); } else @@ -2211,21 +2181,18 @@ struct yyGLRStack { break; else if (yyisErrorAction (yyaction)) { - YYDPRINTF ((stderr, "Stack %lu dies.\n", - (unsigned long) yyk.get())); + YY_DEBUG_STREAM << "Stack " << yyk.get() << " dies\n"; yystateStack.yytops.yymarkStackDeleted (yyk); break; } else { YYRESULTTAG yyflag = yyglrReduce (yyk, -yyaction, - yyimmediate[-yyaction]]b4_user_args[); + yyimmediate[-yyaction]); if (yyflag == yyerr) { - YYDPRINTF ((stderr, - "Stack %lu dies " - "(predicate failure or explicit user error).\n", - (unsigned long) yyk.get())); + YY_DEBUG_STREAM << "Stack " << yyk.get() << " dies " + "(predicate failure or explicit user error).\n"; yystateStack.yytops.yymarkStackDeleted (yyk); break; } @@ -2290,7 +2257,7 @@ struct yyGLRStack { } catch (const syntax_error& yyexc) { - YYDPRINTF ((stderr, "Caught exception: %s\n", yyexc.what()));]b4_locations_if([ + YY_DEBUG_STREAM << "Caught exception: " << yyexc.what() << '\n';]b4_locations_if([ *yylocp = yyexc.location;])[ yyerror (]b4_yyerror_args[yyexc.what ()); YYERROR; @@ -2308,7 +2275,7 @@ struct yyGLRStack { } YYRESULTTAG - yyresolveStack (]b4_user_formals_no_comma[) + yyresolveStack () { if (yystateStack.isSplit()) { @@ -2317,8 +2284,7 @@ struct yyGLRStack { yys != yystateStack.yysplitPoint; yys = yys->pred()) yyn += 1; - YYCHK (yyresolveStates (firstTopState(), yyn - ]b4_user_args[)); + YYCHK (yyresolveStates (firstTopState(), yyn)); } return yyok; } @@ -2342,7 +2308,7 @@ struct yyGLRStack { yyGLRStackItem* yyrhs = yystateStack.topAt(yyk)->asItem(); yystateStack.pop_back(YY_CAST (size_t, yynrhs)); yystateStack.setFirstTop(&yystateStack[yystateStack.size() - 1].getState()); - YY_REDUCE_PRINT ((true, yyrhs, yyk, yyrule]b4_user_args[)); + YY_REDUCE_PRINT ((true, yyrhs, yyk, yyrule, yyparser]b4_user_args[)); return yyuserAction (yyrule, yynrhs, yyrhs, yyvalp]b4_locations_if([, yylocp])[); } @@ -2361,7 +2327,7 @@ struct yyGLRStack { } yystateStack.yyupdateSplit (*yys); yystateStack.setTopAt(yyk, yys); - YY_REDUCE_PRINT ((false, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, yyk, yyrule]b4_user_args[)); + YY_REDUCE_PRINT ((false, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, yyk, yyrule, yyparser]b4_user_args[)); return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, yyvalp]b4_locations_if([, yylocp])[); } @@ -2380,28 +2346,28 @@ struct yyGLRStack { */ inline YYRESULTTAG yyglrReduce (yyStateSetIndex yyk, yyRuleNum yyrule, - bool yyforceEval]b4_user_formals[) + bool yyforceEval) { size_t yyposn = topState(yyk)->yyposn; if (yyforceEval || !yystateStack.isSplit()) { YYSTYPE yysval;]b4_locations_if([[ - YYLTYPE yyloc;]])[ + YYLTYPE loc;]])[ - YYRESULTTAG yyflag = yydoAction (yyk, yyrule, &yysval]b4_locations_if([, &yyloc])[); + YYRESULTTAG yyflag = yydoAction (yyk, yyrule, &yysval]b4_locations_if([, &loc])[); if (yyflag == yyerr && yystateStack.isSplit()) { - YYDPRINTF ((stderr, "Parse on stack %lu rejected by rule #%d.\n", - (unsigned long) yyk.get(), yyrule - 1)); + YY_DEBUG_STREAM << "Parse on stack " << yyk.get() + << " rejected by rule #" << yyrule - 1 << ".\n"; } if (yyflag != yyok) return yyflag; - YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (]b4_namespace_ref::b4_parser_class[::symbol_kind_type, yyr1[yyrule]), &yysval, &yyloc); + YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (]b4_namespace_ref::b4_parser_class[::symbol_kind_type, yyr1[yyrule]), &yysval, &loc); yyglrShift (yyk, yyLRgotoState (topState(yyk)->yylrState, yylhsNonterm (yyrule)), - yyposn, &yysval]b4_locations_if([, &yyloc])[); + yyposn, &yysval]b4_locations_if([, &loc])[); } else { @@ -2414,10 +2380,10 @@ struct yyGLRStack { } yystateStack.yyupdateSplit (*yys); yyStateNum yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule)); - YYDPRINTF ((stderr, - "Reduced stack %lu by rule #%d; action deferred. " - "Now in state %d.\n", - (unsigned long) yyk.get(), yyrule - 1, yynewLRState)); + YY_DEBUG_STREAM << "Reduced stack " << yyk.get() + << " by rule #" << yyrule - 1 + << "; action deferred. Now in state " << yynewLRState + << ".\n"; for (yyStateSetIndex yyi = yycreateStateSetIndex(0); yyi.uget() < yystateStack.numTops(); ++yyi) if (yyi != yyk && yystateStack.topAt(yyi) != YY_NULLPTR) { @@ -2431,9 +2397,8 @@ struct yyGLRStack { { yyaddDeferredAction (yyk, yyp, yys0, yyrule); yystateStack.yytops.yymarkStackDeleted (yyk); - YYDPRINTF ((stderr, "Merging stack %lu into stack %lu.\n", - (unsigned long) yyk.get(), - (unsigned long) yyi.get())); + YY_DEBUG_STREAM << "Merging stack " << yyk.get() + << " into stack " << yyi.get() << ".\n"; return yyok; } yyp = yyp->pred(); @@ -2507,7 +2472,7 @@ struct yyGLRStack { yyGLRState* state = topState(k);]b4_locations_if([[ yyerror_range[1].getState().yyloc = state->yyloc;]])[ if (state->pred() != YY_NULLPTR) - state->destroy ("Cleanup: popping"]b4_user_args[); + state->destroy ("Cleanup: popping", yyparser]b4_user_args[); yystateStack.setTopAt(k, state->pred()); yystateStack.pop_back(); } @@ -2521,14 +2486,14 @@ struct yyGLRStack { * of whether result = yyok, each state has been left with consistent * data so that destroy can be invoked if necessary. */ YYRESULTTAG - yyresolveStates (yyGLRState* yys, int yyn]b4_user_formals[) + yyresolveStates (yyGLRState* yys, int yyn) { if (0 < yyn) { YYASSERT (yys->pred() != YY_NULLPTR); - YYCHK (yyresolveStates (yys->pred(), yyn-1]b4_user_args[)); + YYCHK (yyresolveStates (yys->pred(), yyn-1)); if (! yys->yyresolved) - YYCHK (yyresolveValue (yys]b4_user_args[)); + YYCHK (yyresolveValue (yys)); } return yyok; } @@ -2541,9 +2506,10 @@ struct yyGLRStack { * result = yyok, YYS has been left with consistent data so that * destroy can be invoked if necessary. */ YYRESULTTAG - yyresolveValue (yyGLRState* yys]b4_user_formals[) + yyresolveValue (yyGLRState* yys) { yySemanticOption* yybest = yys->firstVal(); + YYASSERT(yybest != YY_NULLPTR); bool yymerge = false; YYSTYPE yysval; YYRESULTTAG yyflag;]b4_locations_if([ @@ -2563,8 +2529,8 @@ struct yyGLRStack { switch (yypreference (yybest, yyp)) { case 0:]b4_locations_if([[ - yyresolveLocations (yys, 1]b4_user_args[);]])[ - return yystateStack.yyreportAmbiguity (yybest, yyp]b4_pure_args[); + yyresolveLocations (yys, 1);]])[ + return yystateStack.yyreportAmbiguity (yybest, yyp, yyparser]b4_pure_args[); break; case 1: yymerge = true; @@ -2636,11 +2602,11 @@ struct yyGLRStack { yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1]; int yynrhs = yyrhsLength (yyopt->yyrule); YYRESULTTAG yyflag = - yyresolveStates (yyoptState, yynrhs]b4_user_args[); + yyresolveStates (yyoptState, yynrhs); if (yyflag != yyok) { for (yyGLRState *yys = yyoptState; yynrhs > 0; yys = yys->pred(), yynrhs -= 1) - yys->destroy ("Cleanup: popping"]b4_user_args[); + yys->destroy ("Cleanup: popping", yyparser]b4_user_args[); return yyflag; } @@ -2668,11 +2634,11 @@ struct yyGLRStack { * ending at YYS1. Has no effect on previously resolved states. * The first semantic option of a state is always chosen. */ void - yyresolveLocations (yyGLRState *yys1, int yyn1]b4_user_formals[) + yyresolveLocations (yyGLRState *yys1, int yyn1) { if (0 < yyn1) { - yyresolveLocations (yys1->pred(), yyn1 - 1]b4_user_args[); + yyresolveLocations (yys1->pred(), yyn1 - 1); if (!yys1->yyresolved) { yyGLRStackItem yyrhsloc[1 + YYMAXRHS]; @@ -2682,7 +2648,7 @@ struct yyGLRStack { yynrhs = yyrhsLength (yyoption->yyrule); if (0 < yynrhs) { - yyresolveLocations (yyoption->state(), yynrhs]b4_user_args[); + yyresolveLocations (yyoption->state(), yynrhs); yyGLRState *yys = yyoption->state(); for (int yyn = yynrhs; yyn > 0; yyn -= 1) { @@ -2715,13 +2681,13 @@ struct yyGLRStack { /** If yychar is empty, fetch the next token. */ static inline ]b4_namespace_ref::b4_parser_class[::symbol_kind_type -yygetToken (int *yycharp][]b4_pure_if([, yyGLRStack* yystackp])[]b4_user_formals[) +yygetToken (int *yycharp, ]b4_namespace_ref[::]b4_parser_class[& yyparser][]b4_pure_if([, yyGLRStack* yystackp])[]b4_user_formals[) { ]b4_namespace_ref::b4_parser_class[::symbol_kind_type yytoken; ]b4_parse_param_use()dnl [ if (*yycharp == ]b4_namespace_ref::b4_parser_class::token::b4_symbol(-2, id)[) { - YYDPRINTF ((stderr, "Reading a token\n")); + YY_DEBUG_STREAM << "Reading a token\n"; #if YY_EXCEPTIONS try { @@ -2731,7 +2697,7 @@ yygetToken (int *yycharp][]b4_pure_if([, yyGLRStack* yystackp])[]b4_user_formals } catch (const ]b4_namespace_ref[::]b4_parser_class[::syntax_error& yyexc) { - YYDPRINTF ((stderr, "Caught exception: %s\n", yyexc.what()));]b4_locations_if([ + YY_DEBUG_STREAM << "Caught exception: " << yyexc.what() << "\n";]b4_locations_if([ yylloc = yyexc.location;])[ yyerror (]b4_lyyerror_args[yyexc.what ()); // Map errors caught in the scanner to the error token, so that error @@ -2744,7 +2710,7 @@ yygetToken (int *yycharp][]b4_pure_if([, yyGLRStack* yystackp])[]b4_user_formals { *yycharp = ]b4_namespace_ref::b4_parser_class::token::b4_symbol(0, id)[; yytoken = ]b4_namespace_ref::b4_parser_class::symbol_kind::b4_symbol(0, kind)[; - YYDPRINTF ((stderr, "Now at end of input.\n")); + YY_DEBUG_STREAM << "Now at end of input.\n"; } else { @@ -2877,14 +2843,14 @@ yypreference (yySemanticOption* y0, yySemanticOption* y1) `----------*/ int -yyparse (]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param)], [void])[) +yyparse (]b4_namespace_ref[::]b4_parser_class[& yyparser]b4_user_formals[) { int yyresult; - yyGLRStack yystack(YYINITDEPTH]b4_user_args[); + yyGLRStack yystack(YYINITDEPTH, yyparser]b4_user_args[); yyGLRStack* const yystackp = &yystack; size_t yyposn; - YYDPRINTF ((stderr, "Starting parse\n")); + YY_DEBUG_STREAM << "Starting parse\n"; yychar = ]b4_namespace_ref::b4_parser_class::token::b4_symbol(-2, id)[; yylval = yyval_default;]b4_locations_if([ @@ -2913,7 +2879,7 @@ b4_dollar_popdef])[]dnl while (true) { yyStateNum yystate = yystack.firstTopState()->yylrState; - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YY_DEBUG_STREAM << "Entering state " << yystate << "\n"; if (yystate == YYFINAL) goto yyacceptlab; if (yyisDefaultedState (yystate)) @@ -2922,10 +2888,10 @@ b4_dollar_popdef])[]dnl if (yyrule == 0) {]b4_locations_if([[ yystack.yyerror_range[1].getState().yyloc = yylloc;]])[ - yystack.yyreportSyntaxError (]b4_user_args_no_comma[); + yystack.yyreportSyntaxError (); goto yyuser_error; } - YYCHK1 (yystack.yyglrReduce (yycreateStateSetIndex(0), yyrule, true]b4_user_args[)); + YYCHK1 (yystack.yyglrReduce (yycreateStateSetIndex(0), yyrule, true)); } else { @@ -2949,11 +2915,11 @@ b4_dollar_popdef])[]dnl /* Don't issue an error message again for exceptions thrown from the scanner. */ if (yychar != ]b4_namespace_ref::b4_parser_class::token::b4_symbol(1, id)[) - yystack.yyreportSyntaxError (]b4_user_args_no_comma[); + yystack.yyreportSyntaxError (); goto yyuser_error; } else - YYCHK1 (yystack.yyglrReduce (yycreateStateSetIndex(0), -yyaction, true]b4_user_args[)); + YYCHK1 (yystack.yyglrReduce (yycreateStateSetIndex(0), -yyaction, true)); } } @@ -2984,17 +2950,17 @@ b4_dollar_popdef])[]dnl on yylval in the event of memory exhaustion. */ for (yyStateSetIndex yys = yycreateStateSetIndex(0); yys.uget() < yystack.yystateStack.numTops(); ++yys) - YYCHK1 (yystack.yyprocessOneStack (yys, yyposn]b4_lpure_args[)); + YYCHK1 (yystack.yyprocessOneStack (yys, yyposn]b4_pure_if([b4_locations_if([, &yylloc])])[)); yystack.yystateStack.yytops.yyremoveDeletes (); if (yystack.yystateStack.yytops.size() == 0) { yystack.yystateStack.yytops.yyundeleteLastStack (); if (yystack.yystateStack.yytops.size() == 0) - yystack.yyFail (YY_("syntax error")][]b4_lpure_args[); - YYCHK1 (yystack.yyresolveStack (]b4_user_args_no_comma[)); - YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));]b4_locations_if([[ + yystack.yyFail (]b4_pure_if([b4_locations_if([&yylloc, ])])[YY_("syntax error")); + YYCHK1 (yystack.yyresolveStack ()); + YY_DEBUG_STREAM << "Returning to deterministic operation.\n";]b4_locations_if([[ yystack.yyerror_range[1].getState().yyloc = yylloc;]])[ - yystack.yyreportSyntaxError (]b4_user_args_no_comma[); + yystack.yyreportSyntaxError (); goto yyuser_error; } @@ -3013,26 +2979,25 @@ b4_dollar_popdef])[]dnl int yyaction = yygetLRActions (yystate, yytoken_to_shift, &yyconflicts); /* Note that yyconflicts were handled by yyprocessOneStack. */ - YYDPRINTF ((stderr, "On stack %lu, ", (unsigned long) yys.get())); + YY_DEBUG_STREAM << "On stack " << yys.get() << ", "; YY_SYMBOL_PRINT ("shifting", yytoken_to_shift, &yylval, &yylloc); yystack.yyglrShift (yys, yyaction, yyposn, &yylval]b4_locations_if([, &yylloc])[); - YYDPRINTF ((stderr, "Stack %lu now in state #%d\n", - (unsigned long) yys.get(), - yystack.topState(yys)->yylrState)); + YY_DEBUG_STREAM << "Stack " << yys.get() << " now in state #" + << yystack.topState(yys)->yylrState << '\n'; } if (yystack.yystateStack.yytops.size() == 1) { - YYCHK1 (yystack.yyresolveStack (]b4_user_args_no_comma[)); - YYDPRINTF ((stderr, "Returning to deterministic operation.\n")); + YYCHK1 (yystack.yyresolveStack ()); + YY_DEBUG_STREAM << "Returning to deterministic operation.\n"; yystack.yystateStack.yycompressStack (); break; } } continue; yyuser_error: - yystack.yyrecoverSyntaxError (]b4_user_args_no_comma[); + yystack.yyrecoverSyntaxError (]b4_pure_if([b4_locations_if([&yylloc])])[); yyposn = yystack.firstTopState()->yyposn; } @@ -3093,7 +3058,7 @@ m4_if(b4_prefix, [yy], [], `------------------*/ static void -yyerror (]b4_locations_if([[const ]b4_namespace_ref::b4_parser_class[::location_type *yylocationp, +yyerror (]b4_namespace_ref[::]b4_parser_class[& yyparser, ]b4_locations_if([[const ]b4_namespace_ref::b4_parser_class[::location_type *yylocationp, ]])[]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param), ])[const std::string& msg) {
