]> git.saurik.com Git - bison.git/blobdiff - data/push.c
Encapsulate the push parser state variables into an M4 macro so the
[bison.git] / data / push.c
index 98ece5f4ca01f3bc25dad4eeaa993e208081927f..4799a839ec90716c90e1f5b554ae3d03f5acc14f 100644 (file)
@@ -134,7 +134,7 @@ m4_define([b4_rhs_location],
 # 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])[
 
@@ -151,21 +151,18 @@ b4_copyright([Skeleton implementation for Bison's Yacc-like parsers in C],dnl '
 ]b4_identification
 m4_if(b4_prefix, [yy], [],
 [/* Substitute the variable and function names.  */
-#define yyparse b4_prefix[]parse
-]b4_push_if([#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 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[
@@ -376,9 +373,9 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
-  yytype_int16 yyss;
-  YYSTYPE yyvs;
-  ]b4_locations_if([  YYLTYPE yyls;
+  yytype_int16 yyss_alloc;
+  YYSTYPE yyvs_alloc;
+  ]b4_locations_if([  YYLTYPE yyls_alloc;
 ])dnl
 [};
 
@@ -418,12 +415,12 @@ union yyalloc
    elements in the stack, and YYPTR gives the new location of the
    stack.  Advance YYPTR to a properly aligned location for the next
    stack.  */
-# define YYSTACK_RELOCATE(Stack)                                       \
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)                          \
     do                                                                 \
       {                                                                        \
        YYSIZE_T yynewbytes;                                            \
-       YYCOPY (&yyptr->Stack, Stack, yysize);                          \
-       Stack = &yyptr->Stack;                                          \
+       YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
+       Stack = &yyptr->Stack_alloc;                                    \
        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
        yyptr += yynewbytes / sizeof (*yyptr);                          \
       }                                                                        \
@@ -709,7 +706,7 @@ do {                                                                \
                   [[YYSTYPE *yyvsp], [yyvsp]],
     b4_locations_if([[[YYLTYPE *yylsp], [yylsp]],
                   ])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [,
-                  ])b4_parse_param)[
+                  b4_parse_param]))[
 {
   int yynrhs = yyr2[yyrule];
   int yyi;
@@ -964,32 +961,31 @@ yysyntax_error (char *yyresult, int yystate, int yychar)
 
 /* 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]]])
+   m4_ifset([b4_parse_param], [, b4_parse_param]))[
+],[#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;
-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]])[
-])[
+#endif /* ! YYPARSE_PARAM */])[
 
 ]m4_divert_push([KILL])# ======================== M4 code.
-# b4_declare_parser_variables
-# ---------------------------
+# b4_declare_scanner_communication_variables
+# ------------------------------------------
 # Declare the variables that are global, or local to YYPARSE if
 # pure-parser.
-m4_define([b4_declare_parser_variables],
+m4_define([b4_declare_scanner_communication_variables],
 [/* The lookahead symbol.  */
 int yychar;
 
@@ -997,28 +993,28 @@ int yychar;
 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([pv->yyssa],[yyssa]))
-m4_define([b4_yyerror_range],b4_push_if([pv->yyerror_range],[yyerror_range]))
+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
-  {
-]]b4_declare_parser_variables[[
+# b4_declare_parser_state_variables
+# ---------------------------------
+# Declare all the variables that are needed to maintain the parser state
+# between calls to yypush_parse.
+m4_define([b4_declare_parser_state_variables],
+[[
     int yystate;
     int yyn;
     int yyresult;
     /* Number of tokens to shift before error messages enabled.  */
     int yyerrstatus;
     /* Look-ahead token as an internal (translated) token number.  */
-    int yytoken;
+    int yytoken]b4_push_if([], [[ = 0]])[;
 
     /* Three stacks and their tools:
        `yyss': related to states,
@@ -1030,112 +1026,106 @@ m4_define([b4_declare_yyparse_variables],
 
     /* The state stack.  */
     yytype_int16 yyssa[YYINITDEPTH];
-    yytype_int16 *yyss;
+    yytype_int16 *yyss]b4_push_if([], [[ = yyssa]])[;
     yytype_int16 *yyssp;
 
     /* The semantic value stack.  */
     YYSTYPE yyvsa[YYINITDEPTH];
-    YYSTYPE *yyvs;
-    YYSTYPE *yyvsp;]]b4_locations_if([[[
+    YYSTYPE *yyvs]b4_push_if([], [[ = yyvsa]])[;
+    YYSTYPE *yyvsp;]b4_locations_if([[
     /* The location stack.  */
     YYLTYPE yylsa[YYINITDEPTH];
-    YYLTYPE *yyls;
+    YYLTYPE *yyls]b4_push_if([], [[ = yylsa]])[;
     YYLTYPE *yylsp;
     /* The locations where the error started and ended.  */
-    YYLTYPE yyerror_range[2];]]])[
-    YYSIZE_T yystacksize;
-    int yylen;
+    YYLTYPE yyerror_range[2];]])[
+    YYSIZE_T yystacksize]b4_push_if([], [[ = YYINITDEPTH]])[;
     /* The variables used to return semantic value and location from the
        action routines.  */
-    YYSTYPE yyval;
+    YYSTYPE yyval;]b4_locations_if([[
+    YYLTYPE yyloc;]])
+])
+
+m4_divert_pop([KILL])dnl# ====================== End of M4 code.
+
+b4_pure_if([], [b4_declare_scanner_communication_variables])
+
+b4_push_if(
+[[struct yypstate
+  {
+    ]b4_declare_parser_state_variables[
     /* Used to determine if this is the first time this instance has
        been used.  */
-    int yynew;]b4_locations_if([YYLTYPE yyloc;])[
+    int yynew;
   };
 
 /* Initialize the parser data structure.  */
-void *
-yypvarsinit (void)
+]b4_c_function_def([yypstate_new], [yypstate *])[
 {
-  struct yypvars *pv = (struct yypvars *) malloc (sizeof *pv);
-  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;
 
-  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
-
-  pv->yynew = 1;
-
-]b4_locations_if([  pv->yylsp = pv->yyls;])[
+  yyps->yynew = 1;
 
-  return (void *) pv;
-}
-
-void
-yychar_set (struct yypvars *YYPVARS, int yychar)
-{
-  if (YYPVARS)
-    YYPVARS->yychar = yychar;
-}
+]b4_locations_if([  yyps->yylsp = yyps->yyls;])[
 
-void
-yylval_set (struct yypvars *YYPVARS, YYSTYPE yylval)
-{
-  if (YYPVARS)
-    YYPVARS->yylval = yylval;
+  return yyps;
 }
 
-#ifdef YYLTYPE_IS_TRIVIAL
-void
-yylloc_set (struct yypvars *YYPVARS, YYLTYPE yylloc)
+]b4_c_function_def([yypstate_delete], [void],
+                   [[yypstate *yyps], [yyps]])[
 {
-  if (YYPVARS)
-    YYPVARS->yylloc = yylloc;
+  free (yyps);
 }
-#endif])
-m4_divert_pop([KILL])dnl# ====================== End of M4 code.
-
-b4_pure_if([],
-          [b4_declare_parser_variables])
 
-b4_push_if([b4_declare_yyparse_variables])
+#define yystate yyps->yystate
+#define yyn yyps->yyn
+#define yyresult yyps->yyresult
+#define yyerrstatus yyps->yyerrstatus
+#define yytoken yyps->yytoken
+#define yyss yyps->yyss
+#define yyssp yyps->yyssp
+#define yyvs yyps->yyvs
+#define yyvsp yyps->yyvsp
+]b4_locations_if([[#define yyls yyps->yyls
+#define yylsp yyps->yylsp
+]])[#define yystacksize yyps->yystacksize
+#define yyval yyps->yyval
+]b4_locations_if([[#define yyloc yyps->yyloc
+]])])[
 
 /*-------------------------.
-| yyparse or yypushparse.  |
+| yyparse or yypush_parse.  |
 `-------------------------*/
 
-b4_push_if([
-b4_c_function_def([yypushparse], [int], [[struct yypvars *YYPVARS], [YYPVARS]])],[
+]b4_push_if([
+b4_c_function_def([yypush_parse], [int], [[yypstate *yyps], [yyps]], 
+                  [[int yynchar], [yynchar]],
+                  [[YYSTYPE const *yynlval], [yynlval]]
+                 b4_locations_if([,[[YYLTYPE const *yynlloc], [yynlloc]]])
+                  m4_ifset([b4_parse_param], [, b4_parse_param]))],[
 #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])
-{[
-  ]b4_pure_if([b4_declare_parser_variables])[
-  ]b4_push_if([struct yypvars *pv;])[
-  int yystate;
-  int yyn;
-  int yyresult;
-  /* Number of tokens to shift before error messages enabled.  */
-  int yyerrstatus;
-  /* Lookahead token as an internal (translated) token number.  */
-  int yytoken = 0;
+#endif])[
+{
+  ]b4_pure_if([b4_declare_scanner_communication_variables])
+  b4_push_if([], [b4_declare_parser_state_variables])[
+
 #if YYERROR_VERBOSE
   /* Buffer for error messages, and its allocated size.  */
   char yymsgbuf[128];
@@ -1143,54 +1133,24 @@ b4_c_function_def([yyparse], [int], b4_parse_param)
   YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
 #endif
 
-  /* Three stacks and their tools:
-     `yyss': related to states,
-     `yyvs': related to semantic values,
-     `yyls': related to locations.
-
-     Refer to the stacks thru separate pointers, to allow yyoverflow
-     to reallocate them elsewhere.  */
-
-  /* The state stack.  */
-  yytype_int16 yyssa[YYINITDEPTH];
-  yytype_int16 *yyss = yyssa;
-  yytype_int16 *yyssp;
-
-  /* The semantic value stack.  */
-  YYSTYPE yyvsa[YYINITDEPTH];
-  YYSTYPE *yyvs = yyvsa;
-  YYSTYPE *yyvsp;
-
-]b4_locations_if(
-[[  /* The location stack.  */
-  YYLTYPE yylsa[YYINITDEPTH];
-  YYLTYPE *yyls = yylsa;
-  YYLTYPE *yylsp;
-  /* The locations where the error started and ended.  */
-  YYLTYPE yyerror_range[2];
-  ]])[
-
 #define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N)]b4_locations_if([, yylsp -= (N)])[)
 
-  YYSIZE_T yystacksize = YYINITDEPTH;
-
-  /* The variables used to return semantic value and location from the
-     action routines.  */
-  YYSTYPE yyval;
-]b4_locations_if([  YYLTYPE yyloc;])[
-
   /* 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([pv = YYPVARS;])[
+]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.  */])[
 
+]b4_push_if([],[[
   yystate = 0;
   yyerrstatus = 0;
-  yynerrs = 0;
-  yychar = YYEMPTY;            /* Cause a token to be read.  */
 
   /* Initialize stack pointers.
      Waste one element of value and location stack
@@ -1200,13 +1160,18 @@ b4_c_function_def([yyparse], [int], b4_parse_param)
   yyssp = yyss;
   yyvsp = yyvs;
 ]b4_locations_if([[  yylsp = yyls;
-]b4_push_if([],[
 #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])[
-]])
+#endif]])
+])
+[  ]b4_push_if([
+      if (yyps->yynew == 0)
+      {
+       goto gottoken;
+      }
+      yyps->yynew= 0;])
 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
@@ -1218,39 +1183,7 @@ m4_ifdef([b4_dollar_dollar_used],[[  yyvsp[0] = yylval;
 ]])dnl
 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;
-
-       yyss = pv->yyss;
-       yyssp = pv->yyssp;
-
-       yyvs = pv->yyvs;
-       yyvsp = pv->yyvsp;
-
-       ]b4_locations_if([[  /* The location stack.  */
-       yyls = pv->yyls;
-       yylsp = pv->yylsp;]])[
-
-       yystacksize = pv->yystacksize;
-       yylen = pv->yylen;
-       yyval = pv->yyval;
-       ]b4_locations_if([yyloc = pv->yyloc;])[
-      if (pv->yynew == 0)
-      {
-       goto gottoken;
-      }
-      pv->yynew= 0;])[
+[
   goto yysetstate;
 
 /*------------------------------------------------------------.
@@ -1308,9 +1241,9 @@ m4_ifdef([b4_at_dollar_used], [[  yylsp[0] = yylloc;
          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
        if (! yyptr)
          goto yyexhaustedlab;
-       YYSTACK_RELOCATE (yyss);
-       YYSTACK_RELOCATE (yyvs);
-]b4_locations_if([     YYSTACK_RELOCATE (yyls);])[
+       YYSTACK_RELOCATE (yyss_alloc, yyss);
+       YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+]b4_locations_if([     YYSTACK_RELOCATE (yyls_alloc, yyls);])[
 #  undef YYSTACK_RELOCATE
        if (yyss1 != ]b4_yyssa[)
          YYSTACK_FREE (yyss1);
@@ -1357,32 +1290,6 @@ yybackup:
       ]b4_push_if([
        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;
-       pv->yytoken = yytoken;
-
-       pv->yyss = yyss;
-       pv->yyssp = yyssp;
-
-       pv->yyvs = yyvs;
-       pv->yyvsp = yyvsp;
-
-       ]b4_locations_if([[  /* The location stack.  */
-       pv->yyls = yyls;
-       pv->yylsp = yylsp;]])[
-
-       pv->yystacksize = yystacksize;
-       pv->yylen = yylen;
-       pv->yyval = yyval;
-       ]b4_locations_if([pv->yyloc = yyloc;])[
        goto yypushreturn;
 gottoken:])[
       YYDPRINTF ((stderr, "Reading a token: "));
@@ -1498,7 +1405,7 @@ yyerrlab:
   /* 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
@@ -1677,36 +1584,13 @@ yyreturn:
   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([
-#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@
+[@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])
 
@@ -1746,13 +1630,25 @@ typedef struct YYLTYPE
 # define YYLTYPE_IS_TRIVIAL 1
 #endif
 
-]b4_push_if([struct ]b4_prefix[pvars;
-enum { YYPUSH_MORE = 4 };])[
 ]b4_pure_if([],
           [extern YYLTYPE b4_prefix[]lloc;])
 )dnl b4_locations_if
 
+]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]]])
+   m4_ifset([b4_parse_param], [, b4_parse_param]))[
+enum { YYPUSH_MORE = 4 };])[
+
 m4_ifdef([b4_provides],
 [[/* Copy the %provides blocks.  */
-]b4_user_provides])[]dnl
+]b4_user_provides])[]
 ])dnl b4_defines_if