Rearrange initialization of the parser state variables so that the

skeleton doesn't have to have a copy for pull mode and another for push
mode.  This patch also fixes at least a bug such that yylloc was not
initialized (with b4_location_initial_line and
b4_location_initial_column) upon calling yypush_parse.  However, that
initialization now overwrites the first token's location;
%initial-action assigning @$ already did the same thing, and both bugs
will be fixed in a later patch.
* data/push.c (b4_yyssa): Remove and convert all uses to just yyssa.
(b4_declare_parser_state_variables): Remove initialization of yytoken,
yyss, yyvs, yyls, and yystacksize.
(yypstate_new): Remove initialization of some yypstate fields: yystate,
yyerrstatus, yytoken, yyss, yyvs, yyls, yystacksize, yyssp, yyvsp, and
yylsp.
(yyssa, yyvsa, yylsa): For push mode, #define each NAME in this list to
yyps->NAME so it can be used in yypush_parse.
(yyparse or yypush_parse): For yypush_parse, don't print the
"Starting parse" diagnostic for invocations after the first.
Add initialization of yytoken, yyss, yyvs, yyls, and yystacksize; for
yypush_parse, only do it for the first invocation.
Allow yystate, yyerrstatus, yyssp, yyvsp, yylsp, and yylloc
initialization to occur in yypush_parse but only on the first
invocation.
This commit is contained in:
Joel E. Denny
2006-12-20 06:33:30 +00:00
parent 2352216441
commit 9baf4d74a6
2 changed files with 61 additions and 42 deletions

View File

@@ -1002,7 +1002,6 @@ int yynerrs;])b4_locations_if([[
YYLTYPE yylloc;]])
])
m4_define([b4_yyssa],b4_push_if([yyps->yyssa],[yyssa]))
m4_define([b4_yyerror_range],b4_push_if([yyps->yyerror_range],[yyerror_range]))
# b4_declare_parser_state_variables
@@ -1017,7 +1016,7 @@ m4_define([b4_declare_parser_state_variables],
/* Number of tokens to shift before error messages enabled. */
int yyerrstatus;
/* Look-ahead token as an internal (translated) token number. */
int yytoken]b4_push_if([], [[ = 0]])[;
int yytoken;
/* Three stacks and their tools:
`yyss': related to states,
@@ -1029,25 +1028,26 @@ m4_define([b4_declare_parser_state_variables],
/* The state stack. */
yytype_int16 yyssa[YYINITDEPTH];
yytype_int16 *yyss]b4_push_if([], [[ = yyssa]])[;
yytype_int16 *yyss;
yytype_int16 *yyssp;
/* The semantic value stack. */
YYSTYPE yyvsa[YYINITDEPTH];
YYSTYPE *yyvs]b4_push_if([], [[ = yyvsa]])[;
YYSTYPE *yyvsp;]b4_locations_if([[
YYSTYPE *yyvs;
YYSTYPE *yyvsp;
]b4_locations_if([[
/* The location stack. */
YYLTYPE yylsa[YYINITDEPTH];
YYLTYPE *yyls]b4_push_if([], [[ = yylsa]])[;
YYLTYPE *yyls;
YYLTYPE *yylsp;
/* The locations where the error started and ended. */
YYLTYPE yyerror_range[2];]])[
YYSIZE_T yystacksize]b4_push_if([], [[ = YYINITDEPTH]])[;
YYSIZE_T yystacksize;
/* The variables used to return semantic value and location from the
action routines. */
YYSTYPE yyval;]b4_locations_if([[
YYLTYPE yyloc;]])
])
YYSTYPE yyval;
]b4_locations_if([[ YYLTYPE yyloc;
]])])
m4_divert_pop([KILL])dnl# ====================== End of M4 code.
@@ -1066,25 +1066,8 @@ b4_push_if(
]b4_c_function_def([[yypstate_new]], [[yypstate *]])[
{
yypstate *yyps = (yypstate *) malloc (sizeof *yyps);
yyps->yystate = 0;
yyps->yyresult = -1;
yyps->yyerrstatus = 0;
yyps->yytoken = 0;
yyps->yyss = yyps->yyssa;
yyps->yyvs = yyps->yyvsa;
]b4_locations_if([
yyps->yyls = yyps->yylsa;])[
yyps->yystacksize = YYINITDEPTH;
yyps->yyssp = yyps->yyss;
yyps->yyvsp = yyps->yyvs;
yyps->yynew = 1;
]b4_locations_if([ yyps->yylsp = yyps->yyls;])[
return yyps;
}
@@ -1099,11 +1082,14 @@ b4_push_if(
#define yyresult yyps->yyresult
#define yyerrstatus yyps->yyerrstatus
#define yytoken yyps->yytoken
#define yyssa yyps->yyssa
#define yyss yyps->yyss
#define yyssp yyps->yyssp
#define yyvsa yyps->yyvsa
#define yyvs yyps->yyvs
#define yyvsp yyps->yyvsp
]b4_locations_if([[#define yyls yyps->yyls
]b4_locations_if([[#define yylsa yyps->yylsa
#define yyls yyps->yyls
#define yylsp yyps->yylsp
]])[#define yystacksize yyps->yystacksize
#define yyval yyps->yyval
@@ -1141,9 +1127,6 @@ b4_c_function_def([yyparse], [int], b4_parse_param)
/* The number of symbols on the RHS of the reduced rule.
Keep to zero when no symbol should be popped. */
int yylen = 0;
YYDPRINTF ((stderr, "Starting parse\n"));
]b4_push_if([ yychar = yynchar;
if (yynlval)
yylval = *yynlval;
@@ -1151,7 +1134,22 @@ b4_c_function_def([yyparse], [int], b4_parse_param)
yylloc = *yynlloc;])[],[yynerrs = 0;
yychar = YYEMPTY; /* Cause a token to be read. */])[
]b4_push_if([],[[
]b4_push_if([
if (yyps->yynew == 0)
{
goto gottoken;
}
yyps->yynew= 0;])[
yytoken = 0;
yyss = yyssa;
yyvs = yyvsa;
]b4_locations_if([[ yyls = yylsa;
]])[
yystacksize = YYINITDEPTH;
YYDPRINTF ((stderr, "Starting parse\n"));
yystate = 0;
yyerrstatus = 0;
@@ -1162,18 +1160,13 @@ b4_c_function_def([yyparse], [int], b4_parse_param)
yyssp = yyss;
yyvsp = yyvs;
]b4_locations_if([[ yylsp = yyls;
#if YYLTYPE_IS_TRIVIAL
/* Initialize the default location before parsing starts. */
yylloc.first_line = yylloc.last_line = ]b4_location_initial_line[;
yylloc.first_column = yylloc.last_column = ]b4_location_initial_column[;
#endif]])
])
[ ]b4_push_if([
if (yyps->yynew == 0)
{
goto gottoken;
}
yyps->yynew= 0;])
#endif
]])
m4_ifdef([b4_initial_action], [
m4_pushdef([b4_at_dollar], [m4_define([b4_at_dollar_used])yylloc])dnl
m4_pushdef([b4_dollar_dollar], [m4_define([b4_dollar_dollar_used])yylval])dnl
@@ -1247,7 +1240,7 @@ m4_ifdef([b4_at_dollar_used], [[ yylsp[0] = yylloc;
YYSTACK_RELOCATE (yyvs_alloc, yyvs);
]b4_locations_if([ YYSTACK_RELOCATE (yyls_alloc, yyls);])[
# undef YYSTACK_RELOCATE
if (yyss1 != ]b4_yyssa[)
if (yyss1 != yyssa)
YYSTACK_FREE (yyss1);
}
# endif
@@ -1578,7 +1571,7 @@ yyreturn:
YYPOPSTACK (1);
}
#ifndef yyoverflow
if (yyss != ]b4_yyssa[)
if (yyss != yyssa)
YYSTACK_FREE (yyss);
#endif
]b4_push_if([yypushreturn:])[