]> git.saurik.com Git - bison.git/commitdiff
* src/reduce.c (nonterminals_reduce): Instead of throwing away
authorAkim Demaille <akim@epita.fr>
Fri, 30 Nov 2001 10:48:14 +0000 (10:48 +0000)
committerAkim Demaille <akim@epita.fr>
Fri, 30 Nov 2001 10:48:14 +0000 (10:48 +0000)
useless nonterminals, move them at the end of the symbol arrays.
(reduce_output): Adjust.
* tests/reduce.at (Useless Nonterminals): Adjust.

ChangeLog
src/reduce.c
tests/reduce.at

index 1606c8dd5e5dbce2b33568b71d38c8befc0da7ff..afc46aa4eefaad1d8920c5942b88bb99b5e115ae 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2001-11-30  Akim Demaille  <akim@epita.fr>
+
+       * src/reduce.c (nonterminals_reduce): Instead of throwing away
+       useless nonterminals, move them at the end of the symbol arrays.
+       (reduce_output): Adjust.
+       * tests/reduce.at (Useless Nonterminals): Adjust.
+
 2001-11-30  Akim Demaille  <akim@epita.fr>
 
        * src/reduce.c: Various comment/formatting changes.
index 911fb929c5bebfad4ee66931fca9a7904a0007ea..7e164c50633e0eef306fa7472db69b83248434a7 100644 (file)
@@ -342,26 +342,38 @@ nonterminals_reduce (void)
      in the map means it was useless and is being eliminated.  */
 
   short *nontermmap = XCALLOC (short, nvars) - ntokens;
-  for (i = ntokens; i < nsyms; i++)
-    nontermmap[i] = -1;
-
   n = ntokens;
   for (i = ntokens; i < nsyms; i++)
     if (BITISSET (V, i))
       nontermmap[i] = n++;
+  for (i = ntokens; i < nsyms; i++)
+    if (!BITISSET (V, i))
+      nontermmap[i] = n++;
 
-  /* Shuffle elements of tables indexed by symbol number.  */
 
-  for (i = ntokens; i < nsyms; i++)
-    {
-      n = nontermmap[i];
-      if (n >= 0)
-       {
-         sassoc[n] = sassoc[i];
-         sprec[n] = sprec[i];
-         tags[n] = tags[i];
-       }
-    }
+  /* Shuffle elements of tables indexed by symbol number.  */
+  {
+    short *sassoc_sorted = XMALLOC (short, nvars) - ntokens;
+    short *sprec_sorted  = XMALLOC (short, nvars) - ntokens;
+    char **tags_sorted   = XMALLOC (char *, nvars) - ntokens;
+
+    for (i = ntokens; i < nsyms; i++)
+      {
+       n = nontermmap[i];
+       sassoc_sorted[n] = sassoc[i];
+       sprec_sorted[n]  = sprec[i];
+       tags_sorted[n]   = tags[i];
+      }
+    for (i = ntokens; i < nsyms; i++)
+      {
+       sassoc[i] = sassoc_sorted[i];
+       sprec[i]  = sprec_sorted[i];
+       tags[i]   = tags_sorted[i];
+      }
+    free (sassoc_sorted + ntokens);
+    free (sprec_sorted + ntokens);
+    free (tags_sorted + ntokens);
+  }
 
   /* Replace all symbol numbers in valid data structures.  */
 
@@ -403,9 +415,8 @@ reduce_output (FILE *out)
     {
       fprintf (out, _("Useless nonterminals:"));
       fprintf (out, "\n\n");
-      for (i = ntokens; i < nsyms; i++)
-       if (!BITISSET (V, i))
-         fprintf (out, "   %s\n", tags[i]);
+      for (i = 0; i < nuseless_nonterminals; ++i)
+       fprintf (out, "   %s\n", tags[nsyms + i]);
     }
   b = FALSE;
   for (i = 0; i < ntokens; i++)
index ed3a5150daf549236aebe1972995bbc5995280df..08601d509415f1b2139bc9b214241235ea8261d2 100644 (file)
@@ -88,10 +88,12 @@ AT_DATA([[input.y]],
 exp: useful;
 ]])
 
-AT_CHECK([[bison input.y]])
+AT_CHECK([[bison input.y]], 0, [],
+[[input.y contains 9 useless nonterminals
+]])
 
 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
-[[Terminals which are not used:
+[[Useless nonterminals:
    useless1
    useless2
    useless3