From 42a6501d1aeec6050e2ef632913ffe5e90a0ca55 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 26 Aug 2005 20:16:16 +0000 Subject: [PATCH] * data/glr.c (yydestroyGLRState): Renamed from yydestroyStackItem. All uses changed. Invoke user destructor after an error during a split parse (trivial change from Joel E. Denny). * tests/glr-regression.at (User destructor after an error during a split parse): New test case. Problem reported by Joel E. Denny in: http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html --- ChangeLog | 11 ++++++ data/glr.c | 31 ++++++++++------ tests/glr-regression.at | 80 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 104 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7d6b6a07..2a90ba82 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2005-08-26 Paul Eggert + + * data/glr.c (yydestroyGLRState): Renamed from yydestroyStackItem. + All uses changed. Invoke user destructor after an error during a + split parse (trivial change from Joel E. Denny). + + * tests/glr-regression.at + (User destructor after an error during a split parse): New test case. + Problem reported by Joel E. Denny in: + http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html + 2005-08-25 Paul Eggert * README-cvs: Give URLs for recommended tools. diff --git a/data/glr.c b/data/glr.c index 96bb4b0d..342e5b16 100644 --- a/data/glr.c +++ b/data/glr.c @@ -886,8 +886,15 @@ yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1) ]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) +{ + return yyr2[yyrule]; +} + static void -yydestroyStackItem (char const *yymsg, yyGLRState *yys) +yydestroyGLRState (char const *yymsg, yyGLRState *yys) { if (yys->yyresolved) yydestruct (yymsg, yystos[yys->yylrState], @@ -903,14 +910,18 @@ yydestroyStackItem (char const *yymsg, yyGLRState *yys) YYFPRINTF (stderr, "\n"); } #endif - } -} -/** Number of symbols composing the right hand side of rule #RULE. */ -static inline int -yyrhsLength (yyRuleNum yyrule) -{ - return yyr2[yyrule]; + if (yys->yysemantics.yyfirstVal) + { + yySemanticOption *yyoption = yys->yysemantics.yyfirstVal; + yyGLRState *yyrhs; + int yyn; + for (yyrhs = yyoption->yystate, yyn = yyrhsLength (yyoption->yyrule); + yyn > 0; + yyrhs = yyrhs->yypred, yyn -= 1) + yydestroyGLRState (yymsg, yyrhs); + } + } } /** Left-hand-side symbol for rule #RULE. */ @@ -2001,7 +2012,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack, } } ]b4_location_if([[ yystack->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[ - yydestroyStackItem ("Error: popping", yys); + yydestroyGLRState ("Error: popping", yys); yystack->yytops.yystates[0] = yys->yypred; yystack->yynextFree -= 1; yystack->yyspaceLeft += 1; @@ -2201,7 +2212,7 @@ b4_syncline([@oline@], [@ofile@])])dnl { yyGLRState *yys = yystates[0]; ]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]] -)[ yydestroyStackItem ("Cleanup: popping", yys); +)[ yydestroyGLRState ("Cleanup: popping", yys); yystates[0] = yys->yypred; yystack.yynextFree -= 1; yystack.yyspaceLeft += 1; diff --git a/tests/glr-regression.at b/tests/glr-regression.at index a2d3ce76..0fb97057 100644 --- a/tests/glr-regression.at +++ b/tests/glr-regression.at @@ -406,7 +406,7 @@ merge (YYSTYPE s1, YYSTYPE s2) static void yyerror (char const *msg) { - printf ("%s\n", msg); + fprintf (stderr, "%s\n", msg); } ]]) @@ -422,11 +422,11 @@ AT_CHECK([[./glr-regr4]], 0, AT_CLEANUP -## ---------------------------------------------------------------------- ## -## User destructor for unresolved GLR semantic value ## -## Thanks to Joel E. Denny for this test; see ## -## . ## -## ---------------------------------------------------------------------- ## +## ------------------------------------------------------------------------- ## +## User destructor for unresolved GLR semantic value ## +## Thanks to Joel E. Denny for this test; see ## +## . ## +## ------------------------------------------------------------------------- ## AT_SETUP([User destructor for unresolved GLR semantic value]) @@ -470,7 +470,7 @@ yylex (void) static void yyerror (char const *msg) { - printf ("%s\n", msg); + fprintf (stderr, "%s\n", msg); } int @@ -485,7 +485,71 @@ AT_CHECK([[bison -o glr-regr5.c glr-regr5.y]], 0, [], ]) AT_COMPILE([glr-regr5]) -AT_CHECK([[./glr-regr5]], 0, +AT_CHECK([[./glr-regr5]], 0, [], +[syntax is ambiguous +]) + +AT_CLEANUP + + +## ------------------------------------------------------------------------- ## +## User destructor after an error during a split parse ## +## Thanks to Joel E. Denny for this test; see ## +## . ## +## ------------------------------------------------------------------------- ## + +AT_SETUP([User destructor after an error during a split parse]) + +AT_DATA_GRAMMAR([glr-regr6.y], +[[%{ + #include + #include + static void yyerror (char const *); + static int yylex (void); +%} + +%glr-parser +%union { int value; } +%type 'a' + +%destructor { + printf ("Destructor called.\n"); +} 'a' + +%% + +start: 'a' | 'a' ; + +%% + +static int +yylex (void) +{ + static char const *input = "a"; + return *input++; +} + +static void +yyerror (char const *msg) +{ + fprintf (stderr, "%s\n", msg); +} + +int +main (void) +{ + return yyparse () != 1; +} +]]) + +AT_CHECK([[bison -o glr-regr6.c glr-regr6.y]], 0, [], +[glr-regr6.y: conflicts: 1 reduce/reduce +]) +AT_COMPILE([glr-regr6]) + +AT_CHECK([[./glr-regr6]], 0, +[Destructor called. +], [syntax is ambiguous ]) -- 2.45.2