From f9315de5a470cb492502c8fbcadafca3a47abd33 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 21 Aug 2005 23:43:56 +0000 Subject: [PATCH] * data/glr.c (yyresolveValue): Fix redundant parse tree problem reported by Joel E. Denny in (trivial change). * tests/glr-regression.at (Duplicate representation of merged trees): New test, from Joel E. Denny in: . * THANKS: Add Joel E. Denny. --- ChangeLog | 13 ++++++ THANKS | 1 + data/glr.c | 45 ++++++++++++-------- tests/glr-regression.at | 93 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 134 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index cf20f4ab..f102faa1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2005-08-21 Paul Eggert + + * data/glr.c (yyresolveValue): Fix redundant parse tree problem + reported by Joel E. Denny in + + (trivial change). + * tests/glr-regression.at (Duplicate representation of merged trees): + New test, from Joel E. Denny in: + . + * THANKS: Add Joel E. Denny. + + * configure.ac (AC_INIT): Bump to 2.0c. + 2005-07-24 Paul Eggert * NEWS: Version 2.0b. diff --git a/THANKS b/THANKS index a85d2759..983bf687 100644 --- a/THANKS +++ b/THANKS @@ -34,6 +34,7 @@ Jan Nieuwenhuizen janneke@gnu.org Jesse Thilo jthilo@gnu.org Jim Kent jkent@arch.sel.sony.com Jim Meyering jim@meyering.net +Joel E. Denny jdenny@hubcap.clemson.edu Juan Manuel Guerrero ST001906@HRZ1.HRZ.TU-Darmstadt.De Kees Zeelenberg kzlg@users.sourceforge.net Keith Browne kbrowne@legato.com diff --git a/data/glr.c b/data/glr.c index 75c6f981..db26d2be 100644 --- a/data/glr.c +++ b/data/glr.c @@ -1606,35 +1606,44 @@ yyresolveValue (yySemanticOption* yyoptionList, yyGLRStack* yystack, YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[) { yySemanticOption* yybest; - yySemanticOption* yyp; + yySemanticOption** yypp; yybool yymerge; yybest = yyoptionList; yymerge = yyfalse; - for (yyp = yyoptionList->yynext; yyp != NULL; yyp = yyp->yynext) + for (yypp = &yyoptionList->yynext; *yypp != NULL; ) { + yySemanticOption* yyp = *yypp; + if (yyidenticalOptions (yybest, yyp)) - yymergeOptionSets (yybest, yyp); + { + yymergeOptionSets (yybest, yyp); + *yypp = yyp->yynext; + } else - switch (yypreference (yybest, yyp)) - { - case 0: - yyreportAmbiguity (yybest, yyp, yystack]b4_pure_args[); - break; - case 1: - yymerge = yytrue; - break; - case 2: - break; - case 3: - yybest = yyp; - yymerge = yyfalse; - break; - } + { + switch (yypreference (yybest, yyp)) + { + case 0: + yyreportAmbiguity (yybest, yyp, yystack]b4_pure_args[); + break; + case 1: + yymerge = yytrue; + break; + case 2: + break; + case 3: + yybest = yyp; + yymerge = yyfalse; + break; + } + yypp = &yyp->yynext; + } } if (yymerge) { + yySemanticOption* yyp; int yyprec = yydprec[yybest->yyrule]; YYCHK (yyresolveAction (yybest, yystack, yyvalp, yylocp]b4_user_args[)); for (yyp = yybest->yynext; yyp != NULL; yyp = yyp->yynext) diff --git a/tests/glr-regression.at b/tests/glr-regression.at index 4ac981c0..91768a19 100644 --- a/tests/glr-regression.at +++ b/tests/glr-regression.at @@ -327,3 +327,96 @@ AT_CHECK([[echo p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2 | ./glr-regr3]], 0, ]], []) AT_CLEANUP + + +## ---------------------------------------------------------------------- ## +## Duplicate representation of merged trees ## +## Thanks to Joel E. Denny for this test; see ## +## . ## +## ---------------------------------------------------------------------- ## + +AT_SETUP([Duplicate representation of merged trees]) + +AT_DATA_GRAMMAR([glr-regr4.y], +[[%union { char *ptr; } +%type S A A1 A2 B +%glr-parser + +%{ + #include + #include + #include + static char *merge (YYSTYPE, YYSTYPE); + static char *make_value (char *, char *); + static void yyerror (char const *); + static int yylex (void); +%} + +%% + +tree: S { printf ("%s\n", $1); } ; + +S: + A %merge { $$ = make_value ("S", $1); } + | B %merge { $$ = make_value ("S", $1); } + ; + +A: + A1 %merge { $$ = make_value ("A", $1); } + | A2 %merge { $$ = make_value ("A", $1); } + ; + +A1: 'a' { $$ = make_value ("A1", "'a'"); } ; +A2: 'a' { $$ = make_value ("A2", "'a'"); } ; +B: 'a' { $$ = make_value ("B", "'a'"); } ; + +%% + +static int +yylex (void) +{ + static char const *input = "a"; + return *input++; +} + +int +main (void) +{ + return yyparse (); +} + +static char * +make_value (char *parent, char *child) +{ + char const format[] = "%s <- %s"; + char *value = malloc (strlen (parent) + strlen (child) + sizeof format); + sprintf (value, format, parent, child); + return value; +} + +static char * +merge (YYSTYPE s1, YYSTYPE s2) +{ + char const format[] = "merge{ %s and %s }"; + char *value = malloc (strlen (s1.ptr) + strlen (s2.ptr) + sizeof format); + sprintf (value, format, s1.ptr, s2.ptr); + return value; +} + +static void +yyerror (char const *msg) +{ + printf ("%s\n", msg); +} +]]) + +AT_CHECK([[bison -o glr-regr4.c glr-regr4.y]], 0, [], +[glr-regr4.y: conflicts: 1 reduce/reduce +]) +AT_COMPILE([glr-regr4]) + +AT_CHECK([[./glr-regr4]], 0, +[[merge{ S <- merge{ A <- A1 <- 'a' and A <- A2 <- 'a' } and S <- B <- 'a' } +]], []) + +AT_CLEANUP -- 2.47.2