]> git.saurik.com Git - bison.git/blobdiff - data/push.c
* data/push.c (yypstate): Add typedef, and update all uses of
[bison.git] / data / push.c
index a96515672133b0ed75df1ccf343232fecabb0ae8..b7eededf9ceb25070e1b7a19fb18418419240d04 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,24 +151,21 @@ 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
-#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
@@ -188,9 +185,9 @@ b4_push_if([#define yyresult_get b4_prefix[]result_get
 # 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)[
 
@@ -220,9 +217,9 @@ typedef struct YYLTYPE
 # 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[
@@ -964,25 +961,23 @@ 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]]]))[
+],[#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
@@ -997,18 +992,21 @@ 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([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;
@@ -1017,14 +1015,6 @@ m4_define([b4_declare_yyparse_variables],
     /* 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,
@@ -1035,7 +1025,6 @@ m4_define([b4_declare_yyparse_variables],
 
     /* The state stack.  */
     yytype_int16 yyssa[YYINITDEPTH];
-    yytype_int16 *yyssa_ptr;
     yytype_int16 *yyss;
     yytype_int16 *yyssp;
 
@@ -1048,102 +1037,64 @@ m4_define([b4_declare_yyparse_variables],
     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 */
@@ -1151,7 +1102,7 @@ b4_c_function_def([yyparse], [int], b4_parse_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;
@@ -1162,7 +1113,6 @@ b4_c_function_def([yyparse], [int], b4_parse_param)
 #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
@@ -1177,7 +1127,6 @@ b4_c_function_def([yyparse], [int], b4_parse_param)
 
   /* The state stack.  */
   yytype_int16 yyssa[YYINITDEPTH];
-  yytype_int16 *yyssa_ptr = yyssa;
   yytype_int16 *yyss = yyssa;
   yytype_int16 *yyssp;
 
@@ -1192,8 +1141,7 @@ b4_c_function_def([yyparse], [int], b4_parse_param)
   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)])[)
@@ -1211,12 +1159,14 @@ b4_c_function_def([yyparse], [int], b4_parse_param)
 
   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
@@ -1245,45 +1195,31 @@ m4_ifdef([b4_dollar_dollar_used],[[  yyvsp[0] = yylval;
 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;
 
 /*------------------------------------------------------------.
@@ -1345,7 +1281,7 @@ m4_ifdef([b4_at_dollar_used], [[  yylsp[0] = yylloc;
        YYSTACK_RELOCATE (yyvs);
 ]b4_locations_if([     YYSTACK_RELOCATE (yyls);])[
 #  undef YYSTACK_RELOCATE
-       if (yyss1 != yyssa_ptr)
+       if (yyss1 != ]b4_yyssa[)
          YYSTACK_FREE (yyss1);
       }
 # endif
@@ -1388,46 +1324,31 @@ yybackup:
   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)
@@ -1539,7 +1460,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
@@ -1550,14 +1471,14 @@ yyerrlab:
            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;
              }
          }
@@ -1577,7 +1498,7 @@ yyerrlab:
 #endif
     }
 
-]b4_locations_if([[  yyerror_range[0] = yylloc;]])[
+]b4_locations_if([[  ]b4_yyerror_range[[0] = yylloc;]])[
 
   if (yyerrstatus == 3)
     {
@@ -1614,7 +1535,7 @@ yyerrorlab:
   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);
@@ -1648,7 +1569,7 @@ yyerrlab1:
       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);
@@ -1658,10 +1579,10 @@ yyerrlab1:
 
   *++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.  */
@@ -1710,51 +1631,28 @@ yyreturn:
       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)
 
@@ -1788,12 +1686,24 @@ typedef struct YYLTYPE
 # 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