glr2.cc: being pure is not an option

Remove the useless conditional b4_pure_if: the skeleton is, of course,
pure (no global variables).  Make glr2.cc intrinsically pure.

* data/skeletons/glr2.cc (b4_pure_if): Remove definition and uses.
(b4_lex): New.
Stolen from lalr1.cc to avoid needing to use the one from c.m4.
This commit is contained in:
Akim Demaille
2020-12-12 18:01:24 +01:00
parent c8006f4637
commit 178a033e8b

View File

@@ -73,6 +73,18 @@ m4_defn([b4_initial_action])]))])[
b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol($1, kind_base))
])
# b4_lex
# ------
# Call yylex.
m4_define([b4_lex],
[b4_token_ctor_if(
[b4_function_call([yylex],
[symbol_type], m4_ifdef([b4_lex_param], b4_lex_param))],
[b4_function_call([yylex], [int],
[b4_api_PREFIX[STYPE*], [&yylval]][]dnl
b4_locations_if([, [[location*], [&yylloc]]])dnl
m4_ifdef([b4_lex_param], [, ]b4_lex_param))])])
# b4_shared_declarations(hh|cc)
# -----------------------------
@@ -314,11 +326,9 @@ m4_define_default([b4_stack_depth_init], [200])
## ------------------------ ##
## Pure/impure interfaces. ##
## ------------------------ ##
b4_define_flag_if([pure])
## ------------ ##
## Interfaces. ##
## ------------ ##
# b4_user_formals
# ---------------
@@ -421,11 +431,7 @@ b4_copyright([Skeleton implementation for Bison GLR parsers in C],
#define yyparse ]b4_prefix[parse
#define yylex ]b4_prefix[lex
#define yyerror ]b4_prefix[error
#define yydebug ]b4_prefix[debug]]b4_pure_if([], [[
#define yylval ]b4_prefix[lval
#define yychar ]b4_prefix[char
#define yynerrs ]b4_prefix[nerrs]b4_locations_if([[
#define yylloc ]b4_prefix[lloc]])]))[
#define yydebug ]b4_prefix[debug]])[
]b4_user_pre_prologue[
@@ -613,8 +619,6 @@ dnl We probably ought to introduce a type for confl.
# define YYRHSLOC(Rhs, K) ((Rhs)[K].getState().yyloc)
]])[
]b4_pure_if(
[
#undef yynerrs
#define yynerrs (yystackp->yyerrcnt)
#undef yychar
@@ -623,16 +627,12 @@ dnl We probably ought to introduce a type for confl.
#define yylval (yystackp->yyval)
#undef yylloc
#define yylloc (yystackp->yyloc)
m4_if(b4_prefix[], [yy], [],
[#define b4_prefix[]nerrs yynerrs
#define b4_prefix[]char yychar
#define b4_prefix[]lval yylval
#define b4_prefix[]lloc yylloc])],
[YYSTYPE yylval;]b4_locations_if([[
YYLTYPE yylloc;]])[
int yynerrs;
int yychar;])[
]m4_if(b4_prefix[], [yy], [],
[[#define ]b4_prefix[nerrs yynerrs
#define ]b4_prefix[char yychar
#define ]b4_prefix[lval yylval
#define ]b4_prefix[lloc yylloc]])[
enum YYRESULTTAG { yyok, yyaccept, yyabort, yyerr };
@@ -728,10 +728,10 @@ state_set_index create_state_set_index(std::ptrdiff_t value) {
]b4_table_value_equals([[table]], [[Yytable_value]], [b4_table_ninf], [YYTABLE_NINF])[
]m4_define([b4_yygetToken_call],
[[yygetToken (yychar, yyparser][]b4_pure_if([, yystackp])[]b4_user_args[)]])[
[[yygetToken (yychar, yyparser, yystackp]b4_user_args[)]])[
static inline yysymbol_kind_t
yygetToken (int& yycharp, ]b4_namespace_ref[::]b4_parser_class[& yyparser][]b4_pure_if([, glr_stack* yystackp])[]b4_user_formals[);
yygetToken (int& yycharp, ]b4_namespace_ref[::]b4_parser_class[& yyparser, glr_stack* yystackp]b4_user_formals[);
static inline bool
yyisShiftAction (int yyaction)
@@ -1876,14 +1876,11 @@ public:
int yyerrState;
]b4_locations_if([[ /* To compute the location of the error token. */
glr_stack_item yyerror_range[3];]])[
]b4_pure_if(
[
state_stack yystateStack;
int yyerrcnt;
int yyrawchar;
YYSTYPE yyval;]b4_locations_if([[
YYLTYPE yyloc;]])[
])[
YYJMP_BUF yyexception_buffer;
]b4_namespace_ref[::]b4_parser_class[& yyparser;
@@ -2695,7 +2692,7 @@ public:
/** If yychar is empty, fetch the next token. */
static inline yysymbol_kind_t
yygetToken (int& yycharp, ]b4_namespace_ref[::]b4_parser_class[& yyparser][]b4_pure_if([, glr_stack* yystackp])[]b4_user_formals[)
yygetToken (int& yycharp, ]b4_namespace_ref[::]b4_parser_class[& yyparser, glr_stack* yystackp]b4_user_formals[)
{
yysymbol_kind_t yytoken;
]b4_parse_param_use()dnl
@@ -2962,13 +2959,13 @@ b4_dollar_popdef])[]dnl
on yylval in the event of memory exhaustion. */
for (state_set_index yys = create_state_set_index(0); yys.uget() < yystack.yystateStack.numTops(); ++yys)
YYCHK1 (yystack.yyprocessOneStack (yys, yyposn]b4_pure_if([b4_locations_if([, &yylloc])])[));
YYCHK1 (yystack.yyprocessOneStack (yys, yyposn]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 (]b4_pure_if([b4_locations_if([&yylloc, ])])[YY_("syntax error"));
yystack.yyFail (]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;]])[
@@ -3009,7 +3006,7 @@ b4_dollar_popdef])[]dnl
}
continue;
yyuser_error:
yystack.yyrecoverSyntaxError (]b4_pure_if([b4_locations_if([&yylloc])])[);
yystack.yyrecoverSyntaxError (]b4_locations_if([&yylloc])[);
yyposn = yystack.firstTopState()->yyposn;
}