# We do want M4 expansion after # for CPP macros.
m4_changecom()
m4_divert(0)dnl
-@output @output_parser_name@
+@output b4_parser_file_name
b4_copyright([Skeleton implementation for Bison's Yacc-like parsers in C],dnl '
[1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006])[
]b4_identification
m4_if(b4_prefix, [yy], [],
[/* Substitute the variable and function names. */
-#define yyparse b4_prefix[]parse
-#define yypushparse b4_prefix[]pushparse
-#define yypvarsinit b4_prefix[]pvarsinit
-#define yypvars b4_prefix[]pvars
+]b4_push_if([#define yypush_parse b4_prefix[]push_parse
+#define yypstate_new b4_prefix[]pstate_new
+#define yypstate_delete b4_prefix[]pstate_delete
+#define yypstate b4_prefix[]pstate],
+[#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_push_if([#define yyresult_get b4_prefix[]result_get
-#define yychar_set b4_prefix[]char_set
-#define yylval_set b4_prefix[]lval_set
-#define yylloc_set b4_prefix[]lloc_set])])[
+b4_locations_if([#define yylloc b4_prefix[]lloc])])[
/* Copy the first part of user declarations. */
-]b4_pre_prologue[
+]b4_user_pre_prologue[
/* Enabling traces. */
#ifndef YYDEBUG
# define YYTOKEN_TABLE ]b4_token_table[
#endif
-]m4_ifdef([b4_start_header],
-[[/* Copy the %start-header blocks. */
-]b4_start_header])[]dnl
+]m4_ifdef([b4_requires],
+[[/* Copy the %requires blocks. */
+]b4_user_requires])[]dnl
b4_token_enums_defines(b4_tokens)[
# define YYLTYPE_IS_TRIVIAL 1
#endif])
-m4_ifdef([b4_end_header],
-[[/* Copy the %end-header blocks. */
-]b4_end_header])[]dnl
+m4_ifdef([b4_provides],
+[[/* Copy the %provides blocks. */
+]b4_user_provides])[]dnl
[/* Copy the second part of user declarations. */
]b4_user_post_prologue[
/* Prevent warnings from -Wmissing-prototypes. */
-#ifdef YYPARSE_PARAM
+]b4_push_if([
+struct yypstate;
+typedef struct yypstate yypstate;
+enum { YYPUSH_MORE = 4 };
+]b4_c_function_decl([yypstate_new], [yypstate *], [[void], []])[
+]b4_c_function_decl([yypstate_delete], [void], [[yypstate *yyps], [yyps]])[
+]b4_c_function_decl([yypush_parse], [int],
+ [[yypstate *yyps], [yyps]],
+ [[int yynchar], [yynchar]],
+ [[YYSTYPE const *yynlval], [yynlval]]
+ b4_locations_if([,[[YYLTYPE const *yynlloc], [yynlloc]]]))[
+],[#ifdef YYPARSE_PARAM
]b4_c_function_decl([yyparse], [int],
[[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[
#else /* ! YYPARSE_PARAM */
]b4_c_function_decl([yyparse], [int], b4_parse_param)[
-#endif /* ! YYPARSE_PARAM */
-
-]b4_push_if([
-struct yypvars;
-]b4_c_function_decl([yyresult_get], [int], [[struct yypvars *YYPVARS], [YYPVARS]])[
-]b4_c_function_decl([yychar_set], [void], [[struct yypvars *YYPVARS], [YYPVARS]], [[int yychar], [yychar]])[
-]b4_c_function_decl([yylval_set], [void], [[struct yypvars *YYPVARS], [YYPVARS]], [[YYSTYPE yylval], [yylval]])[
-#ifdef YYLTYPE_IS_TRIVIAL
-]b4_c_function_decl([yylloc_set], [void], [[struct yypvars *YYPVARS], [YYPVARS]], [[YYLTYPE yylloc], [yylloc]])[
-#endif
-]b4_c_function_decl([yypvarsinit], [void *], [[void], []])[
-]b4_c_function_decl([yypushparse], [void],
- [[struct yypvars *YYPVARS], [YYPVARS]])[
-])[
+#endif /* ! YYPARSE_PARAM */])[
]m4_divert_push([KILL])# ======================== M4 code.
# b4_declare_parser_variables
YYSTYPE yylval;
/* Number of syntax errors so far. */
-int yynerrs;b4_locations_if([
+]b4_push_if([],[
+int yynerrs;])[b4_locations_if([
/* Location data for the lookahead symbol. */
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_yyparse_variables
# ----------------------------
# Declare all the variables that are needed local to YYPARSE
m4_define([b4_declare_yyparse_variables],
-[[struct yypvars
+[[struct yypstate
{
-]]b4_declare_parser_variables[[
int yystate;
int yyn;
int yyresult;
/* Look-ahead token as an internal (translated) token number. */
int yytoken;
-#if YYERROR_VERBOSE
- /* Buffer for error messages, and its allocated size. */
- char yymsgbuf[128];
- char *yymsgbuf_ptr;
- char *yymsg;
- YYSIZE_T yymsg_alloc;
-#endif
-
/* Three stacks and their tools:
`yyss': related to states,
`yyvs': related to semantic values,
/* The state stack. */
yytype_int16 yyssa[YYINITDEPTH];
- yytype_int16 *yyssa_ptr;
yytype_int16 *yyss;
yytype_int16 *yyssp;
YYLTYPE *yyls;
YYLTYPE *yylsp;
/* The locations where the error started and ended. */
- YYLTYPE yyerror_range[2];
- YYLTYPE *yyerror_range_ptr;]]])[
+ YYLTYPE yyerror_range[2];]]])[
YYSIZE_T yystacksize;
- int yylen;
/* The variables used to return semantic value and location from the
action routines. */
YYSTYPE yyval;
- /* Used to determine if this is the first time this instance has
+ /* Used to determine if this is the first time this instance has
been used. */
int yynew;]b4_locations_if([YYLTYPE yyloc;])[
};
-/* Init the parser data structure. Use malloc, should perhaps use a
- system dependent equivalent function. */
-void*
-yypvarsinit (void)
+/* Initialize the parser data structure. */
+]b4_c_function_def([yypstate_new], [yypstate *])[
{
- struct yypvars *pv;
- pv= (struct yypvars *) malloc(sizeof(struct yypvars));
- pv->yystate = 0;
- pv->yyresult = -1;
- pv->yyerrstatus = 0;
- pv->yytoken = 0;
+ yypstate *yyps = (yypstate *) malloc (sizeof *yyps);
+ yyps->yystate = 0;
+ yyps->yyresult = -1;
+ yyps->yyerrstatus = 0;
+ yyps->yytoken = 0;
-#if YYERROR_VERBOSE
- pv->yymsgbuf_ptr = pv->yymsgbuf;
- pv->yymsg = pv->yymsgbuf;
- pv->yymsg_alloc = sizeof pv->yymsgbuf;
-#endif
-
- pv->yyssa_ptr = pv->yyssa;
- pv->yyss = pv->yyssa;
- pv->yyvs = pv->yyvsa;
+ yyps->yyss = yyps->yyssa;
+ yyps->yyvs = yyps->yyvsa;
]b4_locations_if([
- pv->yyls = pv->yylsa;])[
- pv->yystacksize = YYINITDEPTH;
+ yyps->yyls = yyps->yylsa;])[
+ yyps->yystacksize = YYINITDEPTH;
- pv->yyssp = pv->yyss;
- pv->yyvsp = pv->yyvs;
+ yyps->yyssp = yyps->yyss;
+ yyps->yyvsp = yyps->yyvs;
-#if YYLTYPE_IS_TRIVIAL
- /* Initialize the default location before parsing starts. */
- pv->yylloc.first_line = pv->yylloc.last_line = ]b4_location_initial_line[;
- pv->yylloc.first_column = pv->yylloc.last_column = ]b4_location_initial_column[;
-#endif
+ yyps->yynew = 1;
- pv->yynew = 1;
+]b4_locations_if([ yyps->yylsp = yyps->yyls;])[
-]b4_locations_if([ pv->yylsp = pv->yyls;])[
- /* Init parser variables */
-
- return (void*) pv;
+ return yyps;
}
-int
-yyresult_get (struct yypvars *YYPVARS)
+]b4_c_function_def([yypstate_delete], [void],
+ [[yypstate *yyps], [yyps]])[
{
- return YYPVARS->yyresult;
+ free (yyps);
}
-
-void
-yychar_set (struct yypvars *YYPVARS, int yychar)
-{
- if (YYPVARS)
- YYPVARS->yychar = yychar;
-}
-
-void
-yylval_set (struct yypvars *YYPVARS, YYSTYPE yylval)
-{
- if (YYPVARS)
- YYPVARS->yylval = yylval;
-}
-
-#ifdef YYLTYPE_IS_TRIVIAL
-void
-yylloc_set (struct yypvars *YYPVARS, YYLTYPE yylloc)
-{
- if (YYPVARS)
- YYPVARS->yylloc = yylloc;
-}
-#endif])
+])
m4_divert_pop([KILL])dnl# ====================== End of M4 code.
-b4_pure_if([],
- [b4_declare_parser_variables])
+b4_push_if([],[b4_pure_if([],
+ [b4_declare_parser_variables])])
b4_push_if([b4_declare_yyparse_variables])
/*-------------------------.
-| yyparse or yypushparse. |
+| yyparse or yypush_parse. |
`-------------------------*/
b4_push_if([
-b4_c_function_def([yypushparse], [void], [[struct yypvars *YYPVARS], [YYPVARS]])],[
+b4_c_function_def([yypush_parse], [int], [[yypstate *yyps], [yyps]],
+ [[int yynchar], [yynchar]],
+ [[YYSTYPE const *yynlval], [yynlval]]
+ b4_locations_if([,[[YYLTYPE const *yynlloc], [yynlloc]]]))],[
#ifdef YYPARSE_PARAM
b4_c_function_def([yyparse], [int], [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])
#else /* ! YYPARSE_PARAM */
#endif])
{[
]b4_pure_if([b4_declare_parser_variables])[
- ]b4_push_if([struct yypvars *pv;])[
+ ]b4_push_if([b4_declare_parser_variables])[
int yystate;
int yyn;
int yyresult;
#if YYERROR_VERBOSE
/* Buffer for error messages, and its allocated size. */
char yymsgbuf[128];
- char *yymsgbuf_ptr = yymsgbuf;
char *yymsg = yymsgbuf;
YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
#endif
/* The state stack. */
yytype_int16 yyssa[YYINITDEPTH];
- yytype_int16 *yyssa_ptr = yyssa;
yytype_int16 *yyss = yyssa;
yytype_int16 *yyssp;
YYLTYPE *yyls = yylsa;
YYLTYPE *yylsp;
/* The locations where the error started and ended. */
- YYLTYPE yyerror_range[2];
- YYLTYPE *yyerror_range_ptr = yyerror_range;
+ ]b4_push_if([],[YYLTYPE yyerror_range[[2]]])[;
]])[
#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)]b4_locations_if([, yylsp -= (N)])[)
YYDPRINTF ((stderr, "Starting parse\n"));
- ]b4_push_if([pv = YYPVARS;])[
-
yystate = 0;
yyerrstatus = 0;
- yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
+]b4_push_if([ yychar = yynchar;
+ if (yynlval)
+ yylval = *yynlval;
+]b4_locations_if([ if (yynlloc)
+ yylloc = *yynlloc;])[],[yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */])[
/* Initialize stack pointers.
Waste one element of value and location stack
m4_ifdef([b4_at_dollar_used], [[ yylsp[0] = yylloc;
]])dnl
[ ]b4_push_if([
- /* Initialize the locals to the current context. */
- yychar = pv->yychar;
- yylval = pv->yylval;
- yynerrs = pv->yynerrs;
- ]b4_locations_if([
- yylloc = pv->yylloc;])[
-
- yystate = pv->yystate;
- yyn = pv->yyn;
- yyresult = pv->yyresult;
- yyerrstatus = pv->yyerrstatus;
- yytoken = pv->yytoken;
-#if YYERROR_VERBOSE
- yymsgbuf_ptr = pv->yymsgbuf_ptr;
- yymsg = pv->yymsg;;
- yymsg_alloc = pv->yymsg_alloc;
-#endif
- yyssa_ptr = pv->yyssa_ptr;
- yyss = pv->yyss;
- yyssp = pv->yyssp;
+ /* Initialize the locals to the current context. */
+ yystate = yyps->yystate;
+ yyn = yyps->yyn;
+ yyresult = yyps->yyresult;
+ yyerrstatus = yyps->yyerrstatus;
+ yytoken = yyps->yytoken;
- yyvs = pv->yyvs;
- yyvsp = pv->yyvsp;
+ yyss = yyps->yyss;
+ yyssp = yyps->yyssp;
- ]b4_locations_if([[ /* The location stack. */
- yyls = pv->yyls;
- yylsp = pv->yylsp;
+ yyvs = yyps->yyvs;
+ yyvsp = yyps->yyvsp;
- yyerror_range_ptr = pv->yyerror_range_ptr;]])[
+ ]b4_locations_if([[ /* The location stack. */
+ yyls = yyps->yyls;
+ yylsp = yyps->yylsp;]])[
- yystacksize = pv->yystacksize;
- yylen = pv->yylen;
- yyval = pv->yyval;
- ]b4_locations_if([yyloc = pv->yyloc;])[
- if (pv->yynew == 0)
+ yystacksize = yyps->yystacksize;
+ yyval = yyps->yyval;
+ ]b4_locations_if([yyloc = yyps->yyloc;])[
+ if (yyps->yynew == 0)
{
goto gottoken;
}
- pv->yynew= 0;])[
+ yyps->yynew= 0;])[
goto yysetstate;
/*------------------------------------------------------------.
YYSTACK_RELOCATE (yyvs);
]b4_locations_if([ YYSTACK_RELOCATE (yyls);])[
# undef YYSTACK_RELOCATE
- if (yyss1 != yyssa_ptr)
+ if (yyss1 != ]b4_yyssa[)
YYSTACK_FREE (yyss1);
}
# endif
if (yychar == YYEMPTY)
{
]b4_push_if([
- YYDPRINTF ((stderr, "Return for a new token:\n"));
- yyresult= 4;
- /* Initialize the locals to the current context. */
- pv->yychar = yychar;
- pv->yylval = yylval;
- pv->yynerrs = yynerrs;
- ]b4_locations_if([
- pv->yylloc = yylloc;])[
-
- pv->yystate = yystate;
- pv->yyn = yyn;
- pv->yyresult = yyresult;
- pv->yyerrstatus = yyerrstatus;
- pv->yytoken = yytoken;
-#if YYERROR_VERBOSE
- pv->yymsgbuf_ptr = yymsgbuf_ptr;
- pv->yymsg = yymsg;;
- pv->yymsg_alloc = yymsg_alloc;
-#endif
- pv->yyssa_ptr = yyssa_ptr;
- pv->yyss = yyss;
- pv->yyssp = yyssp;
+ YYDPRINTF ((stderr, "Return for a new token:\n"));
+ yyresult = YYPUSH_MORE;
+ /* Initialize the locals to the current context. */
+ yyps->yystate = yystate;
+ yyps->yyn = yyn;
+ yyps->yyerrstatus = yyerrstatus;
+ yyps->yytoken = yytoken;
- pv->yyvs = yyvs;
- pv->yyvsp = yyvsp;
+ yyps->yyss = yyss;
+ yyps->yyssp = yyssp;
+
+ yyps->yyvs = yyvs;
+ yyps->yyvsp = yyvsp;
]b4_locations_if([[ /* The location stack. */
- pv->yyls = yyls;
- pv->yylsp = yylsp;
- pv->yyerror_range_ptr = yyerror_range_ptr;]])[
-
- pv->yystacksize = yystacksize;
- pv->yylen = yylen;
- pv->yyval = yyval;
- ]b4_locations_if([pv->yyloc = yyloc;])[
- return;
-gottoken:
- YYDPRINTF((stderr, "Reading a token: "));],[
- YYDPRINTF ((stderr, "Reading a token: "));
- yychar = YYLEX;])[
+ yyps->yyls = yyls;
+ yyps->yylsp = yylsp;]])[
+
+ yyps->yystacksize = yystacksize;
+ yyps->yyval = yyval;
+ ]b4_locations_if([yyps->yyloc = yyloc;])[
+ goto yypushreturn;
+gottoken:])[
+ YYDPRINTF ((stderr, "Reading a token: "));
+ ]b4_push_if([], [yychar = YYLEX;])[
}
if (yychar <= YYEOF)
/* If not already recovering from an error, report this error. */
if (!yyerrstatus)
{
- ++yynerrs;
+]b4_push_if([],[ ++yynerrs;])[
#if ! YYERROR_VERBOSE
yyerror (]b4_yyerror_args[YY_("syntax error"));
#else
YYSIZE_T yyalloc = 2 * yysize;
if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
yyalloc = YYSTACK_ALLOC_MAXIMUM;
- if (yymsg != yymsgbuf_ptr)
+ if (yymsg != yymsgbuf)
YYSTACK_FREE (yymsg);
yymsg = (char *) YYSTACK_ALLOC (yyalloc);
if (yymsg)
yymsg_alloc = yyalloc;
else
{
- yymsg = yymsgbuf_ptr;
+ yymsg = yymsgbuf;
yymsg_alloc = sizeof yymsgbuf;
}
}
#endif
}
-]b4_locations_if([[ yyerror_range[0] = yylloc;]])[
+]b4_locations_if([[ ]b4_yyerror_range[[0] = yylloc;]])[
if (yyerrstatus == 3)
{
if (/*CONSTCOND*/ 0)
goto yyerrorlab;
-]b4_locations_if([[ yyerror_range[0] = yylsp[1-yylen];
+]b4_locations_if([[ ]b4_yyerror_range[[0] = yylsp[1-yylen];
]])[ /* Do not reclaim the symbols of the rule which action triggered
this YYERROR. */
YYPOPSTACK (yylen);
if (yyssp == yyss)
YYABORT;
-]b4_locations_if([[ yyerror_range[0] = *yylsp;]])[
+]b4_locations_if([[ ]b4_yyerror_range[[0] = *yylsp;]])[
yydestruct ("Error: popping",
yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
YYPOPSTACK (1);
*++yyvsp = yylval;
]b4_locations_if([[
- yyerror_range[1] = yylloc;
+ ]b4_yyerror_range[[1] = yylloc;
/* Using YYLLOC is tempting, but would change the location of
the lookahead. YYLOC is available though. */
- YYLLOC_DEFAULT (yyloc, (yyerror_range- 1), 2);
+ YYLLOC_DEFAULT (yyloc, (]b4_yyerror_range[- 1), 2);
*++yylsp = yyloc;]])[
/* Shift the error token. */
YYPOPSTACK (1);
}
#ifndef yyoverflow
- if (yyss != yyssa_ptr)
+ if (yyss != ]b4_yyssa[)
YYSTACK_FREE (yyss);
#endif
+]b4_push_if([yypushreturn:])[
#if YYERROR_VERBOSE
- if (yymsg != yymsgbuf_ptr)
+ if (yymsg != yymsgbuf)
YYSTACK_FREE (yymsg);
#endif
- ]b4_push_if([pv->yyresult = YYID (yyresult);],[
- /* Make sure YYID is used. */
- return YYID (yyresult);
- ])[
+ ]b4_push_if([yyps->yyresult = YYID (yyresult);])[
+ /* Make sure YYID is used. */
+ return YYID (yyresult);
]}
-b4_push_if([
-#ifdef YYPARSE_PARAM
-b4_c_function_def([yyparse], [int], [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])
-#else /* ! YYPARSE_PARAM */
-b4_c_function_def([yyparse], [int], b4_parse_param)
-#endif
-{[
- struct yypvars *ctx = yypvarsinit ();
- int status;
- do {
- yychar_set (ctx, yylex ());
- yylval_set (ctx, yylval);
-#ifdef YYLTYPE_IS_TRIVIAL
- yylloc_set (ctx, yylloc);
-#endif
- yypushparse (ctx);
- status = yyresult_get (ctx);
- } while (status == 4);
- free (ctx);
- return status;
-]}])
-
-
b4_epilogue
b4_defines_if(
-[@output @output_header_name@
+[@output b4_spec_defines_file
b4_copyright([Skeleton interface for Bison's Yacc-like parsers in C],dnl '
[1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006])
-m4_ifdef([b4_start_header],
-[[/* Copy the %start-header blocks. */
-]b4_start_header])[]dnl
+m4_ifdef([b4_requires],
+[[/* Copy the %requires blocks. */
+]b4_user_requires])[]dnl
b4_token_enums_defines(b4_tokens)
# define YYLTYPE_IS_TRIVIAL 1
#endif
-]b4_push_if([struct ]b4_prefix[pvars;])[
]b4_pure_if([],
[extern YYLTYPE b4_prefix[]lloc;])
)dnl b4_locations_if
-m4_ifdef([b4_end_header],
-[[/* Copy the %end-header blocks. */
-]b4_end_header])[]dnl
+]b4_push_if([struct ]b4_prefix[pstate;
+typedef struct ]b4_prefix[pstate ]b4_prefix[pstate;
+]b4_c_function_decl([]b4_prefix[pstate_new], []b4_prefix[pstate *],
+ [[void], []])[
+]b4_c_function_decl([]b4_prefix[pstate_delete], [void],
+ [[]b4_prefix[pstate *yyps],[yyps]])[
+]b4_c_function_decl([]b4_prefix[push_parse], [int],
+ [[]b4_prefix[pstate *]b4_prefix[pstate], []b4_prefix[pstate]],
+ [[int yynchar], [yynchar]],
+ [[YYSTYPE const *yynlval], [yynlval]]
+ b4_locations_if([,[[YYLTYPE const *yynlloc], [yynlloc]]]))[
+enum { YYPUSH_MORE = 4 };])[
+
+m4_ifdef([b4_provides],
+[[/* Copy the %provides blocks. */
+]b4_user_provides])[]
])dnl b4_defines_if