]> git.saurik.com Git - bison.git/commitdiff
* data/glr.c (yyresolveValue): Fix redundant parse tree problem
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 21 Aug 2005 23:43:56 +0000 (23:43 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 21 Aug 2005 23:43:56 +0000 (23:43 +0000)
reported by Joel E. Denny in
<http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00004.html>
(trivial change).
* tests/glr-regression.at (Duplicate representation of merged trees):
New test, from Joel E. Denny in:
<http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>.
* THANKS: Add Joel E. Denny.

ChangeLog
THANKS
data/glr.c
tests/glr-regression.at

index cf20f4abe6db47332c1777c25bdb4b1060d435ed..f102faa18654a55fb3113d561b078fbd600c15b8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2005-08-21  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * data/glr.c (yyresolveValue): Fix redundant parse tree problem
+       reported by Joel E. Denny in
+       <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00004.html>
+       (trivial change).
+       * tests/glr-regression.at (Duplicate representation of merged trees):
+       New test, from Joel E. Denny in:
+       <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>.
+       * THANKS: Add Joel E. Denny.
+
+       * configure.ac (AC_INIT): Bump to 2.0c.
+
 2005-07-24  Paul Eggert  <eggert@cs.ucla.edu>
 
        * NEWS: Version 2.0b.
diff --git a/THANKS b/THANKS
index a85d27590e2d973c8da879b623bc373cf065f2dc..983bf687b3dbc3da9878eb21556475eafdf8d5e3 100644 (file)
--- 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
index 75c6f9811bb920532bbd063fa7edd9e977a1b52a..db26d2be69c85886030b6578d2559a08bf1c4049 100644 (file)
@@ -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)
index 4ac981c0f82f8d103b4c3099191b508b4780a42b..91768a19ebf2ba2d92c8363ba1aee543df01e189 100644 (file)
@@ -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                             ##
+## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>.  ##
+## ---------------------------------------------------------------------- ##
+
+AT_SETUP([Duplicate representation of merged trees])
+
+AT_DATA_GRAMMAR([glr-regr4.y],
+[[%union { char *ptr; }
+%type <ptr> S A A1 A2 B
+%glr-parser
+
+%{
+  #include <stdio.h>
+  #include <stdlib.h>
+  #include <string.h>
+  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<merge> { $$ = make_value ("S", $1); }
+  | B %merge<merge> { $$ = make_value ("S", $1); }
+  ;
+
+A:
+  A1   %merge<merge> { $$ = make_value ("A", $1); }
+  | A2 %merge<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