mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
glr2.cc: make yyparse a member function
Amusingly enough, glr2.cc still had its core function, yyparse, being a free function instead of a member function. * data/skeletons/glr2.cc (yyparse): Remove this free function called from yyparser::parse. Inline its body into... (yyparser::parse): this member function. This requires moving a bit the yychar, etc. macros. Access to token can be simplified (the b4_namespace_ref::b4_parser_class prefix is no longer needed).
This commit is contained in:
@@ -2849,15 +2849,48 @@ yypreference (const semantic_option& y0, const semantic_option& y1)
|
||||
} while (0)
|
||||
|
||||
|
||||
/*----------.
|
||||
| yyparse. |
|
||||
`----------*/
|
||||
/* DEBUGGING ONLY */
|
||||
#if ]b4_api_PREFIX[DEBUG
|
||||
static void
|
||||
yypstack (glr_stack* yystackp, size_t yyk)
|
||||
{
|
||||
yystackp->yypstack(create_state_set_index(static_cast<std::ptrdiff_t>(yyk)));
|
||||
}
|
||||
static void yypdumpstack (glr_stack* yystackp) {
|
||||
yystackp->yypdumpstack();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
]b4_namespace_open[
|
||||
]dnl In this section, the parse params are the original parse_params.
|
||||
m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
|
||||
[ /// Build a parser object.
|
||||
]b4_parser_class::b4_parser_class[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
|
||||
:])[
|
||||
#if ]b4_api_PREFIX[DEBUG
|
||||
]m4_ifset([b4_parse_param], [ ], [ :])[yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
|
||||
#endif]b4_parse_param_cons[
|
||||
{}
|
||||
|
||||
]b4_parser_class::~b4_parser_class[ ()
|
||||
{}
|
||||
|
||||
]b4_parser_class[::syntax_error::~syntax_error () YY_NOEXCEPT YY_NOTHROW
|
||||
{}
|
||||
|
||||
int
|
||||
yyparse (]b4_namespace_ref[::]b4_parser_class[& yyparser]b4_user_formals[)
|
||||
]b4_parser_class[::operator() ()
|
||||
{
|
||||
return parse ();
|
||||
}
|
||||
|
||||
int
|
||||
]b4_parser_class[::parse ()
|
||||
{
|
||||
]b4_parser_class[ &yyparser = *this;
|
||||
int yyresult;
|
||||
glr_stack yystack(YYINITDEPTH, yyparser]b4_user_args[);
|
||||
glr_stack yystack(YYINITDEPTH, *this]b4_user_args[);
|
||||
glr_stack* const yystackp = &yystack;
|
||||
size_t yyposn;
|
||||
|
||||
@@ -2914,7 +2947,7 @@ b4_dollar_popdef])[]dnl
|
||||
if (yyisShiftAction (yyaction))
|
||||
{
|
||||
YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
|
||||
yychar = ]b4_namespace_ref::b4_parser_class::token::b4_symbol(empty, id)[;
|
||||
yychar = token::]b4_symbol(empty, id)[;
|
||||
yyposn += 1;
|
||||
yystack.yyglrShift (create_state_set_index(0), yyaction, yyposn, yylval]b4_locations_if([, &yylloc])[);
|
||||
if (0 < yystack.yyerrState)
|
||||
@@ -2925,7 +2958,7 @@ b4_dollar_popdef])[]dnl
|
||||
yystack.yyerror_range[1].getState().yyloc = yylloc;]])[
|
||||
/* Don't issue an error message again for exceptions
|
||||
thrown from the scanner. */
|
||||
if (yychar != ]b4_namespace_ref::b4_parser_class::token::b4_symbol(error, id)[)
|
||||
if (yychar != token::]b4_symbol(error, id)[)
|
||||
yystack.yyreportSyntaxError ();
|
||||
goto yyuser_error;
|
||||
}
|
||||
@@ -2937,7 +2970,7 @@ b4_dollar_popdef])[]dnl
|
||||
while (true)
|
||||
{
|
||||
for (state_set_index yys = create_state_set_index(0); yys.uget() < yystack.yystateStack.numTops(); ++yys)
|
||||
yystackp->yystateStack.yytops.setLookaheadNeeds(yys, yychar != ]b4_namespace_ref::b4_parser_class::token::b4_symbol(empty, id)[);
|
||||
yystackp->yystateStack.yytops.setLookaheadNeeds(yys, yychar != token::]b4_symbol(empty, id)[);
|
||||
|
||||
/* yyprocessOneStack returns one of three things:
|
||||
|
||||
@@ -2979,7 +3012,7 @@ b4_dollar_popdef])[]dnl
|
||||
before the loop to make sure the user destructor for yylval isn't
|
||||
called twice. */
|
||||
yysymbol_kind_t yytoken_to_shift = YYTRANSLATE (yychar);
|
||||
yychar = ]b4_namespace_ref::b4_parser_class::token::b4_symbol(empty, id)[;
|
||||
yychar = token::]b4_symbol(empty, id)[;
|
||||
yyposn += 1;
|
||||
for (state_set_index yys = create_state_set_index(0); yys.uget() < yystack.yystateStack.numTops(); ++yys)
|
||||
{
|
||||
@@ -3023,7 +3056,7 @@ b4_dollar_popdef])[]dnl
|
||||
goto yyreturn;
|
||||
|
||||
yyexhaustedlab:
|
||||
yyparser.error (]b4_locations_if([yylloc, ])[YY_("memory exhausted"));
|
||||
error (]b4_locations_if([yylloc, ])[YY_("memory exhausted"));
|
||||
yyresult = 2;
|
||||
goto yyreturn;
|
||||
|
||||
@@ -3031,65 +3064,10 @@ b4_dollar_popdef])[]dnl
|
||||
return yyresult;
|
||||
}
|
||||
|
||||
|
||||
/* DEBUGGING ONLY */
|
||||
#if ]b4_api_PREFIX[DEBUG
|
||||
static void
|
||||
yypstack (glr_stack* yystackp, size_t yyk)
|
||||
{
|
||||
yystackp->yypstack(create_state_set_index(static_cast<std::ptrdiff_t>(yyk)));
|
||||
}
|
||||
static void yypdumpstack (glr_stack* yystackp) {
|
||||
yystackp->yypdumpstack();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#undef yylval
|
||||
#undef yychar
|
||||
#undef yynerrs]b4_locations_if([
|
||||
#undef yylloc])
|
||||
|
||||
m4_if(b4_prefix, [yy], [],
|
||||
[[/* Substitute the variable and function names. */
|
||||
#define yyparse ]b4_prefix[parse
|
||||
#define yylex ]b4_prefix[lex
|
||||
#define yyerror ]b4_prefix[error
|
||||
#define yylval ]b4_prefix[lval
|
||||
#define yychar ]b4_prefix[char
|
||||
#define yydebug ]b4_prefix[debug
|
||||
#define yynerrs ]b4_prefix[nerrs]b4_locations_if([[
|
||||
#define yylloc ]b4_prefix[lloc]])])[
|
||||
|
||||
|
||||
]b4_namespace_open[
|
||||
]dnl In this section, the parse params are the original parse_params.
|
||||
m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
|
||||
[ /// Build a parser object.
|
||||
]b4_parser_class::b4_parser_class[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
|
||||
:])[
|
||||
#if ]b4_api_PREFIX[DEBUG
|
||||
]m4_ifset([b4_parse_param], [ ], [ :])[yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
|
||||
#endif]b4_parse_param_cons[
|
||||
{}
|
||||
|
||||
]b4_parser_class::~b4_parser_class[ ()
|
||||
{}
|
||||
|
||||
]b4_parser_class[::syntax_error::~syntax_error () YY_NOEXCEPT YY_NOTHROW
|
||||
{}
|
||||
|
||||
int
|
||||
]b4_parser_class[::operator() ()
|
||||
{
|
||||
return parse ();
|
||||
}
|
||||
|
||||
int
|
||||
]b4_parser_class[::parse ()
|
||||
{
|
||||
return ::yyparse (*this]b4_user_args[);
|
||||
}
|
||||
#undef yylloc])[
|
||||
|
||||
]b4_parse_error_bmatch([custom\|detailed],
|
||||
[[ const char *
|
||||
|
||||
Reference in New Issue
Block a user