bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

08-symprint-free-glr.patch


From: Akim Demaille
Subject: 08-symprint-free-glr.patch
Date: Tue, 12 Nov 2002 08:44:39 +0100

Index: 0.11/ChangeLog
--- 0.11/ChangeLog Sun, 10 Nov 2002 16:28:44 +0100 akim (bison/d/40_ChangeLog 
1.9 644)
+++ 0.11(w)/ChangeLog Sun, 10 Nov 2002 21:25:42 +0100 akim 
(bison/d/40_ChangeLog 1.9 644)
@@ -1,5 +1,24 @@
 2002-11-10  Akim Demaille  <address@hidden>
 
+       * tests/regression.at (input.y): s/YYEOF/MYEOF/, as the skeleton
+       defines it.
+       * data/glr.c (yystos): New.
+       (b4_yysymprint_generate, b4_yydestruct_generate): Invoke.
+       (YYDSYMPRINT): New.
+       (yyval): Don't define it, it is handled via M4.
+       (yyrecoverParseError): Free verbosely the discarded symbols.
+       * data/yacc.c (yysymprint): Remove, rather...
+       (b4_yysymprint_generate): invoke.
+       * data/c.m4 (b4_yysymprint_generate): New.
+       Accept pointers as arguments, as opposed to the version from
+       yacc.c.
+       (b4_yydestruct_generate): Likewise.
+       * tests/cations.at (Printers and Destructors): Use Bison directives
+       instead of CPP macros.
+       Don't rely on internal details.
+
+2002-11-10  Akim Demaille  <address@hidden>
+
        * data/c.m4 (b4_yydestruct_generate, b4_symbol_actions): New.
        * data/yacc.c: Rename yychar1 as yytoken, as in glr.c.
        Don't work on yychar (i.e., do set it to YYEMPTY, don't match
Index: 0.11/data/glr.c
--- 0.11/data/glr.c Sun, 10 Nov 2002 16:28:44 +0100 akim (bison/b/43_glr.c 1.2 
644)
+++ 0.11(w)/data/glr.c Sun, 10 Nov 2002 21:19:44 +0100 akim (bison/b/43_glr.c 
1.2 644)
@@ -420,6 +420,13 @@
   ]b4_check[
 };
 
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const ]b4_int_type_for([b4_stos])[ yystos[] =
+{
+  ]b4_stos[
+};
+
 
 /* Prevent warning if -Wmissing-prototypes.  */
 ]b4_c_ansi_function_decl([yyparse], [int], b4_parse_param)[
@@ -476,12 +483,25 @@
   if (yydebug)                                 \
     YYFPRINTF Args;                            \
 } while (0)
+
+]b4_yysymprint_generate([b4_c_ansi_function_def])[
+
+# define YYDSYMPRINT(Args)                     \
+do {                                           \
+  if (yydebug)                                 \
+    yysymprint Args;                           \
+} while (0)
+
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
 int yydebug;
+
 #else /* !YYDEBUG */
+
   /* Avoid empty `if' bodies.  */
-# define YYDPRINTF(Args)  {}
+# define YYDPRINTF(Args)   {}
+# define YYDSYMPRINT(Args) {}
+
 #endif /* !YYDEBUG */
 
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
@@ -636,8 +656,6 @@
       *yyvalp = yyvsp[1-yyrhslen].yystate.yysemantics.yysval;
       *yylocp = yyvsp[1-yyrhslen].yystate.yyloc;
     }
-# undef yyval
-# define yyval (*yyvalp)
 # undef yyerrok
 # define yyerrok (yystack->yyerrState = 0)
 # undef YYACCEPT
@@ -664,7 +682,6 @@
      }
 
    return yyok;
-# undef yyval
 # undef yyerrok
 # undef YYABORT
 # undef YYACCEPT
@@ -694,6 +711,8 @@
 [
                              /* Bison grammar-table manipulation.  */
 
+]b4_yydestruct_generate([b4_c_ansi_function_def])[
+
 /** Number of symbols composing the right hand side of rule #RULE. */
 static inline int
 yyrhsLength (yyRuleNum yyrule)
@@ -1636,10 +1655,31 @@
     while (yytrue)
       {
        if (*yytokenp == YYEOF)
-         yyFail (yystack][]b4_lpure_args[, NULL);
+         {
+           /* Now pop stack until we find a state that shifts the
+              error token.  */
+           while (yystack->yytops.yystates[0] != NULL)
+             {
+               yyGLRState *yys = yystack->yytops.yystates[0];
+               YYDPRINTF ((stderr, "Error: popping "));
+               YYDSYMPRINT ((stderr,
+                             yystos[yys->yylrState], 
+                             &yys->yysemantics.yysval]b4_location_if([, 
&yys->yyloc])[));
+               YYDPRINTF ((stderr, "\n"));
+               yydestruct (yystos[yys->yylrState], 
+                           &yys->yysemantics.yysval]b4_location_if([, 
&yys->yyloc])[);
+               yystack->yytops.yystates[0] = yys->yypred;
+               yystack->yynextFree -= 1;
+               yystack->yyspaceLeft += 1;
+             }
+           yyFail (yystack][]b4_lpure_args[, NULL);
+         }
        if (*yytokenp != YYEMPTY)
-         YYDPRINTF ((stderr, "Discarding token %s\n",
-                     yytokenName (*yytokenp)));
+         {
+           YYDPRINTF ((stderr, "Discarding token %s\n",
+                       yytokenName (*yytokenp)));
+           yydestruct (*yytokenp, yylvalp]b4_location_if([, yyllocp])[);
+         }
        YYDPRINTF ((stderr, "Reading a token: "));
        yychar = YYLEX;
        *yytokenp = YYTRANSLATE (yychar);
@@ -1672,16 +1712,24 @@
   /* Now pop stack until we find a state that shifts the error token. */
   while (yystack->yytops.yystates[0] != NULL)
     {
-      yyj = yypact[yystack->yytops.yystates[0]->yylrState] + YYTERROR;
+      yyGLRState *yys = yystack->yytops.yystates[0];
+      yyj = yypact[yys->yylrState] + YYTERROR;
       if (yyj != YYPACT_NINF + YYTERROR && yyj >= 0 && yyj <= YYLAST &&
          yycheck[yyj] == YYTERROR && yyisShiftAction (yytable[yyj]))
        {
+         YYDPRINTF ((stderr, "Shifting error token, "));
          yyglrShift (yystack, 0, yytable[yyj],
-                     yystack->yytops.yystates[0]->yyposn,
-                     *yylvalp, yyllocp]b4_user_args[);
+                     yys->yyposn, *yylvalp, yyllocp]b4_user_args[);
          break;
        }
-      yystack->yytops.yystates[0] = yystack->yytops.yystates[0]->yypred;
+      YYDPRINTF ((stderr, "Error: popping "));
+      YYDSYMPRINT ((stderr,
+                   yystos[yys->yylrState], 
+                   &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[));
+      YYDPRINTF ((stderr, "\n"));
+      yydestruct (yystos[yys->yylrState], 
+                 &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
+      yystack->yytops.yystates[0] = yys->yypred;
       yystack->yynextFree -= 1;
       yystack->yyspaceLeft += 1;
     }
Index: 0.11/data/yacc.c
--- 0.11/data/yacc.c Sun, 10 Nov 2002 16:28:44 +0100 akim (bison/b/45_yacc.c 
1.2 644)
+++ 0.11(w)/data/yacc.c Sun, 10 Nov 2002 17:10:57 +0100 akim (bison/b/45_yacc.c 
1.2 644)
@@ -639,42 +639,8 @@
 
 
 #if YYDEBUG
-/*-----------------------------.
-| Print this symbol on YYOUT.  |
-`-----------------------------*/
-
-b4_c_function_def([yysymprint],
-                 [static void],
-                 [[FILE *yyout],        [yyout]],
-                 [[int yytype],         [yytype]],
-                 [[YYSTYPE yyvalue],    [yyvalue]]b4_location_if([,
-                 [[YYLTYPE yylocation], [yylocation]]]))
-{
-  /* Pacify ``unused variable'' warnings.  */
-  (void) yyvalue;
-b4_location_if([  (void) yylocation;
-])dnl
-
-  if (yytype < YYNTOKENS)
-    {
-      YYFPRINTF (yyout, "token %s (", yytname[[yytype]]);
-# ifdef YYPRINT
-      YYPRINT (yyout, yytoknum[[yytype]], yyvalue);
-# endif
-    }
-  else
-    YYFPRINTF (yyout, "nterm %s (", yytname[[yytype]]);
-
-  switch (yytype)
-    {
-m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
-      default:
-        break;
-    }
-  YYFPRINTF (yyout, ")");
-}
+b4_yysymprint_generate([b4_c_function_def])
 #endif /* YYDEBUG. */
-
 b4_yydestruct_generate([b4_c_function_def])
 
 
@@ -907,7 +873,7 @@
       /* We have to keep this `#if YYDEBUG', since we use variables
         which are defined only if `YYDEBUG' is set.  */
       YYDPRINTF ((stderr, "Next token is "));
-      YYDSYMPRINT ((stderr, yytoken, yylval]b4_location_if([, yyloc])[));
+      YYDSYMPRINT ((stderr, yytoken, &yylval]b4_location_if([, &yyloc])[));
       YYDPRINTF ((stderr, "\n"));
     }
 
@@ -1116,9 +1082,9 @@
              YYDPRINTF ((stderr, "Error: popping "));
              YYDSYMPRINT ((stderr,
                            yystos[*yyssp],
-                           *yyvsp]b4_location_if([, *yylsp])[));
+                           yyvsp]b4_location_if([, yylsp])[));
              YYDPRINTF ((stderr, "\n"));
-             yydestruct (yystos[*yyssp], *yyvsp]b4_location_if([, *yylsp])[);
+             yydestruct (yystos[*yyssp], yyvsp]b4_location_if([, yylsp])[);
              YYPOPSTACK;
            }
          YYABORT;
@@ -1126,7 +1092,7 @@
 
       YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
                  yytoken, yytname[yytoken]));
-      yydestruct (yytoken, yylval]b4_location_if([, yylloc])[);
+      yydestruct (yytoken, &yylval]b4_location_if([, &yylloc])[);
       yytoken = YYEMPTY;
     }
 
@@ -1155,10 +1121,10 @@
 
       YYDPRINTF ((stderr, "Error: popping "));
       YYDSYMPRINT ((stderr,
-                   yystos[*yyssp], *yyvsp]b4_location_if([, *yylsp])[));
+                   yystos[*yyssp], yyvsp]b4_location_if([, yylsp])[));
       YYDPRINTF ((stderr, "\n"));
 
-      yydestruct (yystos[yystate], *yyvsp]b4_location_if([, *yylsp])[);
+      yydestruct (yystos[yystate], yyvsp]b4_location_if([, yylsp])[);
       yyvsp--;
       yystate = *--yyssp;
 ]b4_location_if([      yylsp--;])[
Index: 0.11/data/c.m4
--- 0.11/data/c.m4 Sun, 10 Nov 2002 16:28:44 +0100 akim (bison/b/46_c.m4 1.3 
644)
+++ 0.11(w)/data/c.m4 Sun, 10 Nov 2002 17:11:25 +0100 akim (bison/b/46_c.m4 1.3 
644)
@@ -331,8 +331,8 @@
 #                   SYMBOL-ACTION, SYMBOL-TYPENAME)
 # -------------------------------------------------
 m4_define([b4_symbol_actions],
-[m4_pushdef([b4_dollar_dollar], [yyvalue.$6])dnl
-m4_pushdef([b4_at_dollar], [yylocation])dnl
+[m4_pushdef([b4_dollar_dollar], [yyvaluep->$6])dnl
+m4_pushdef([b4_at_dollar], [(*yylocationp)])dnl
       case $4: /* $3 */
 b4_syncline([$2], [$1])
         $5;
@@ -355,13 +355,13 @@
 
 ]$1([yydestruct],
     [static void],
-    [[int yytype],         [yytype]],
-    [[YYSTYPE yyvalue],    [yyvalue]]b4_location_if([,
-    [[YYLTYPE yylocation], [yylocation]]]))[
+    [[int yytype],           [yytype]],
+    [[YYSTYPE *yyvaluep],    [yyvaluep]]b4_location_if([,
+    [[YYLTYPE *yylocationp], [yylocationp]]]))[
 {
   /* Pacify ``unused variable'' warnings.  */
-  (void) yyvalue;
-]b4_location_if([  (void) yylocation;
+  (void) yyvaluep;
+]b4_location_if([  (void) yylocationp;
 ])[
   switch (yytype)
     {
@@ -371,3 +371,46 @@
     }
 }]dnl
 ])
+
+
+# b4_yysymprint_generate(FUNTION-DECLARATOR)
+# ------------------------------------------
+# Generate the "yysymprint" function, which declaration is issued using
+# FUNTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
+# or "b4_c_function_def" for K&R.
+m4_define([b4_yysymprint_generate],
+[[/*-----------------------------.
+| Print this symbol on YYOUT.  |
+`-----------------------------*/
+
+]$1([yysymprint],
+    [static void],
+    [[FILE *yyout],          [yyout]],
+    [[int yytype],           [yytype]],
+    [[YYSTYPE *yyvaluep],    [yyvaluep]]b4_location_if([,
+    [[YYLTYPE *yylocationp], [yylocationp]]]))
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+b4_location_if([  (void) yylocationp;
+])dnl
+
+  if (yytype < YYNTOKENS)
+    {
+      YYFPRINTF (yyout, "token %s (", yytname[[yytype]]);
+# ifdef YYPRINT
+      YYPRINT (yyout, yytoknum[[yytype]], yyvalue);
+# endif
+    }
+  else
+    YYFPRINTF (yyout, "nterm %s (", yytname[[yytype]]);
+
+  switch (yytype)
+    {
+m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
+      default:
+        break;
+    }
+  YYFPRINTF (yyout, ")");
+}
+])
Index: 0.11/NEWS
--- 0.11/NEWS Sun, 10 Nov 2002 14:55:11 +0100 akim (bison/d/36_NEWS 1.2 644)
+++ 0.11(w)/NEWS Sun, 10 Nov 2002 21:16:29 +0100 akim (bison/d/36_NEWS 1.2 644)
@@ -164,9 +164,9 @@
   the user symbol is used in the reports, the graphs, and the verbose
   error messages instead of `$end', which remains being the default.
   For instance
-     %token YYEOF 0
+     %token MYEOF 0
   or
-     %token YYEOF 0 "end of file"
+     %token MYEOF 0 "end of file"
 
 * Semantic parser
   This old option, which has been broken for ages, is removed.
Index: 0.11/tests/regression.at
--- 0.11/tests/regression.at Fri, 08 Nov 2002 16:19:16 +0100 akim 
(bison/d/49_regression 1.1 644)
+++ 0.11(w)/tests/regression.at Sun, 10 Nov 2002 21:13:33 +0100 akim 
(bison/d/49_regression 1.1 644)
@@ -318,7 +318,7 @@
 void yyerror (const char *s);
 int yylex (void);
 %}
-[%token YYEOF 0 "end of file"
+[%token MYEOF 0 "end of file"
 %token 'a' "a"
 %token b "b"
 %token c 'c'
Index: 0.11/tests/actions.at
--- 0.11/tests/actions.at Fri, 08 Nov 2002 16:19:16 +0100 akim 
(bison/e/2_actions.at 1.1 644)
+++ 0.11(w)/tests/actions.at Sun, 10 Nov 2002 16:33:52 +0100 akim 
(bison/e/2_actions.at 1.1 644)
@@ -167,10 +167,13 @@
 #include <stdlib.h>
 #include <assert.h>
 
-#define YYERROR_VERBOSE 1
-#define YYDEBUG 1
+static int yylex (void);
+static void yyerror (const char *msg);
 %}
+%error-verbose
+%debug
 %verbose
+%locations
 %union
 {
   int ival;
@@ -181,20 +184,20 @@
    input line thing 'x'
 
 %destructor
-  {
-    fprintf (stdout, "Freeing ");
-    /* FIXME: Ouch: INTERNAL DETAILS EXPOSED HERE. */
-    /* Cannot use $$ which is the union member, not the union itself. */
-    yysymprint (stdout, yytype, yyvalue, @$);
-    fprintf (stdout, "\n");
-  }
-  input line thing 'x'
+  { fprintf (stdout, "Freeing nterm input (%d from %d)\n", $$, @$.first_line); 
}
+  input
 
-%{
-static int yylex (void);
-static void yyerror (const char *msg);
-%}
+%destructor
+  { fprintf (stdout, "Freeing nterm line (%d from %d)\n", $$, @$.first_line); }
+  line
+
+%destructor
+  { fprintf (stdout, "Freeing nterm thing (%d from %d)\n", $$, @$.first_line); 
}
+  thing
 
+%destructor
+  { fprintf (stdout, "Freeing token 'x' (%d from %d)\n", $$, @$.first_line); }
+  'x'
 
 %%
 input:
@@ -295,7 +298,7 @@
 }
 ]])
 
-AT_CHECK([bison --location -d -v -o input.c input.y])
+AT_CHECK([bison -o input.c input.y])
 AT_COMPILE([input])
 AT_PARSER_CHECK([./input], 1,
 [[sending: 'x' (value = 0, line 0)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]