#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 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_user_pre_prologue[
]b4_push_if([
struct yypvars;
enum { YYPUSH_MORE = 4 };
-]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], [int],
- [[struct yypvars *YYPVARS], [YYPVARS]])[
+ [[struct yypvars *yypvars], [yypvars]],
+ [[int yynchar], [yynchar]],
+ [[YYSTYPE *yynlval], [yynlval]]
+ b4_locations_if([,[[YYLTYPE *yynlloc], [yynlloc]]]))[
])[
]m4_divert_push([KILL])# ======================== M4 code.
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_declare_yyparse_variables],
[[struct yypvars
{
-]]b4_declare_parser_variables[[
int yystate;
int yyn;
int yyresult;
pv->yyssp = pv->yyss;
pv->yyvsp = pv->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
-
pv->yynew = 1;
]b4_locations_if([ pv->yylsp = pv->yyls;])[
return (void *) pv;
-}
-
-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])
`-------------------------*/
b4_push_if([
-b4_c_function_def([yypushparse], [int], [[struct yypvars *YYPVARS], [YYPVARS]])],[
+b4_c_function_def([yypushparse], [int], [[struct yypvars *yypvars], [yypvars]],
+ [[int yynchar], [yynchar]], [[YYSTYPE *yynlval], [yynlval]]
+ b4_locations_if([,[[YYLTYPE *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([b4_declare_parser_variables])[
]b4_push_if([struct yypvars *pv;])[
int yystate;
int yyn;
YYLTYPE *yyls = yylsa;
YYLTYPE *yylsp;
/* The locations where the error started and ended. */
- YYLTYPE yyerror_range[2];
+ ]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;
+ pv = yypvars;
+ 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
]])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;
YYDPRINTF ((stderr, "Return for a new token:\n"));
yyresult = YYPUSH_MORE;
/* 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->yyerrstatus = yyerrstatus;
/* 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
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
- status = yypushparse (ctx);
- } while (status == YYPUSH_MORE);
- free (ctx);
- return status;
-]}])
-
-
b4_epilogue
b4_defines_if(
[@output @output_header_name@
]AT_SKEL_CC_IF([], [m4_bmatch([$4], [%debug],
[ yydebug = 1;])])[
- status = yyparse (]AT_PARAM_IF([&result, &count])[);
+]AT_PUSH_IF([
+ {
+ struct yypvars *ctx = yypvarsinit ();
+ YYSTYPE my_lval;
+ ]AT_LOCATION_IF([YYLTYPE my_lloc;])[
+ do {
+ status = yypushparse (ctx, yylex (&my_lval]AT_LOCATION_IF([[, &my_lloc]])[), &my_lval]AT_LOCATION_IF([[, &my_lloc]])[);
+ } while (status == YYPUSH_MORE);
+ free (ctx);
+ }],[
+ status = yyparse (]AT_PARAM_IF([[&result, &count]])[);])[
fclose (input);
if (global_result != result)
abort ();
AT_CHECK_CALC_LALR([%error-verbose])
AT_CHECK_CALC_LALR([%pure-parser %locations])
-AT_CHECK_CALC_LALR([%push-parser %locations])
+AT_CHECK_CALC_LALR([%push-parser %locations %skeleton "push.c"])
AT_CHECK_CALC_LALR([%error-verbose %locations])
AT_CHECK_CALC_LALR([%error-verbose %locations %defines %name-prefix "calc" %verbose %yacc])
AT_CHECK_CALC_LALR([%error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
-AT_CHECK_CALC_LALR([%push-parser %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
+AT_CHECK_CALC_LALR([%push-parser %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %skeleton "push.c"])
AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
[m4_bmatch([$3], [%locations], [$1], [$2])])
m4_pushdef([AT_PURE_IF],
[m4_bmatch([$3], [%pure-parser], [$1], [$2])])
+m4_pushdef([AT_PUSH_IF],
+[m4_bmatch([$3], [%push-parser], [$1], [$2])])
+m4_pushdef([AT_PURE_OR_PUSH_IF],
+[m4_bmatch([$3], [%pure-parser\|%push-parser], [$1], [$2])])
m4_pushdef([AT_PURE_AND_LOC_IF],
[m4_bmatch([$3], [%locations.*%pure-parser\|%pure-parser.*%locations],
[$1], [$2])])
[AT_GLR_OR_PARAM_IF([AT_PURE_AND_LOC_IF([$1], [$2])],
[$2])])
# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
+# push or (yacc & pure & !param).
m4_pushdef([AT_YYERROR_SEES_LOC_IF],
-[AT_LOCATION_IF([AT_YACC_IF([AT_PURE_IF([AT_PARAM_IF([$1], [$2])],
+[AT_PUSH_IF([$2],[AT_LOCATION_IF([AT_YACC_IF([AT_PURE_IF([AT_PARAM_IF([$1], [$2])],
[$1])],
[$1])],
- [$2])])
+ [$2])])])
# The interface is pure: either because %pure-parser, or because we
# are using the C++ parsers.
m4_pushdef([AT_PURE_LEX_IF],
-[AT_PURE_IF([$1],
+[AT_PURE_OR_PUSH_IF([$1],
[AT_SKEL_CC_IF([$1], [$2])])])
AT_PURE_LEX_IF(