[Top][All Lists]
[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)
- 08-symprint-free-glr.patch,
Akim Demaille <=