]> git.saurik.com Git - bison.git/blobdiff - src/closure.c
Add Makevars.template, stamp-po.
[bison.git] / src / closure.c
index 191558a3d92a4488d4f59c97bc44db9ea4054596..228056f7bb46c501b4212607cc73494e116a965d 100644 (file)
@@ -1,4 +1,5 @@
-/* Subroutines for bison
+/* Closures for Bison
+
    Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
    Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
    02111-1307, USA.  */
 
 #include "system.h"
    02111-1307, USA.  */
 
 #include "system.h"
-#include "quotearg.h"
-#include "bitset.h"
-#include "bitsetv.h"
+
+#include <bitset.h>
+#include <bitsetv-print.h>
+#include <bitsetv.h>
+#include <quotearg.h>
+
+#include "closure.h"
+#include "derives.h"
 #include "getargs.h"
 #include "getargs.h"
-#include "symtab.h"
 #include "gram.h"
 #include "reader.h"
 #include "gram.h"
 #include "reader.h"
-#include "closure.h"
-#include "derives.h"
+#include "symtab.h"
 
 /* NITEMSET is the size of the array ITEMSET.  */
 
 /* NITEMSET is the size of the array ITEMSET.  */
-short *itemset;
-int nitemset;
+item_number *itemset;
+int nritemset;
 
 static bitset ruleset;
 
 
 static bitset ruleset;
 
@@ -49,17 +53,16 @@ static bitsetv firsts = NULL;
 `-----------------*/
 
 static void
 `-----------------*/
 
 static void
-print_closure (const char *title, short *array, size_t size)
+print_closure (char const *title, item_number *array, size_t size)
 {
   size_t i;
   fprintf (stderr, "Closure: %s\n", title);
   for (i = 0; i < size; ++i)
     {
 {
   size_t i;
   fprintf (stderr, "Closure: %s\n", title);
   for (i = 0; i < size; ++i)
     {
-      short *rp;
+      item_number *rp;
       fprintf (stderr, "  %2d: .", array[i]);
       for (rp = &ritem[array[i]]; *rp >= 0; ++rp)
       fprintf (stderr, "  %2d: .", array[i]);
       for (rp = &ritem[array[i]]; *rp >= 0; ++rp)
-       fprintf (stderr, " %s",
-                quotearg_style (escape_quoting_style, symbols[*rp]->tag));
+       fprintf (stderr, " %s", symbols[*rp]->tag);
       fprintf (stderr, "  (rule %d)\n", -*rp - 1);
     }
   fputs ("\n\n", stderr);
       fprintf (stderr, "  (rule %d)\n", -*rp - 1);
     }
   fputs ("\n\n", stderr);
@@ -69,19 +72,18 @@ print_closure (const char *title, short *array, size_t size)
 static void
 print_firsts (void)
 {
 static void
 print_firsts (void)
 {
-  int i, j;
+  symbol_number i, j;
 
   fprintf (stderr, "FIRSTS\n");
   for (i = ntokens; i < nsyms; i++)
     {
 
   fprintf (stderr, "FIRSTS\n");
   for (i = ntokens; i < nsyms; i++)
     {
-      fprintf (stderr, "\t%s firsts\n",
-              quotearg_style (escape_quoting_style, symbols[i]->tag));
-      for (j = 0; j < nvars; j++)
-       if (bitset_test (FIRSTS (i), j))
-         fprintf (stderr, "\t\t%d (%s)\n",
-                  j + ntokens,
-                  quotearg_style (escape_quoting_style,
-                                  symbols[j + ntokens]->tag));
+      bitset_iterator iter;
+      fprintf (stderr, "\t%s firsts\n", symbols[i]->tag);
+      BITSET_FOR_EACH (iter, FIRSTS (i), j, 0)
+       {
+         fprintf (stderr, "\t\t%s\n",
+                  symbols[j + ntokens]->tag);
+       }
     }
   fprintf (stderr, "\n\n");
 }
     }
   fprintf (stderr, "\n\n");
 }
@@ -90,75 +92,22 @@ print_firsts (void)
 static void
 print_fderives (void)
 {
 static void
 print_fderives (void)
 {
-  int i, j;
+  int i;
+  rule_number r;
 
   fprintf (stderr, "FDERIVES\n");
   for (i = ntokens; i < nsyms; i++)
     {
 
   fprintf (stderr, "FDERIVES\n");
   for (i = ntokens; i < nsyms; i++)
     {
-      fprintf (stderr, "\t%s derives\n",
-              quotearg_style (escape_quoting_style, symbols[i]->tag));
-      for (j = 0; j < nrules + 1; j++)
-       if (bitset_test (FDERIVES (i), j))
-         {
-           short *rhsp;
-           fprintf (stderr, "\t\t%d:", j - 1);
-           for (rhsp = rules[j].rhs; *rhsp >= 0; ++rhsp)
-             fprintf (stderr, " %s",
-                      quotearg_style (escape_quoting_style,
-                                      symbols[*rhsp]->tag));
-           fputc ('\n', stderr);
-         }
+      bitset_iterator iter;
+      fprintf (stderr, "\t%s derives\n", symbols[i]->tag);
+      BITSET_FOR_EACH (iter, FDERIVES (i), r, 0)
+       {
+         fprintf (stderr, "\t\t%3d ", r);
+         rule_rhs_print (&rules[r], stderr);
+       }
     }
   fprintf (stderr, "\n\n");
 }
     }
   fprintf (stderr, "\n\n");
 }
-
-/*--------------------------------------------------------.
-| Display the MATRIX array of SIZE bitsets of size SIZE.  |
-`--------------------------------------------------------*/
-
-static void
-bitmatrix_print (const char *title, bitsetv matrix)
-{
-  size_t i, j;
-  size_t size = bitset_size (matrix[0]);
-
-  /* Title. */
-  fprintf (stderr, "%s BEGIN\n", title);
-
-  /* Column numbers. */
-  fputs ("   ", stderr);
-  for (i = 0; i < size; ++i)
-    putc (i / 10 ? '0' + i / 10 : ' ', stderr);
-  putc ('\n', stderr);
-  fputs ("   ", stderr);
-  for (i = 0; i < size; ++i)
-    fprintf (stderr, "%d", i % 10);
-  putc ('\n', stderr);
-
-  /* Bar. */
-  fputs ("  .", stderr);
-  for (i = 0; i < size; ++i)
-    putc ('-', stderr);
-  fputs (".\n", stderr);
-
-  /* Contents. */
-  for (i = 0; i < size; ++i)
-    {
-      fprintf (stderr, "%2d|", i);
-      for (j = 0; j < size; ++j)
-       fputs (bitset_test (matrix[i], j) ? "1" : " ", stderr);
-      fputs ("|\n", stderr);
-    }
-
-  /* Bar. */
-  fputs ("  `", stderr);
-  for (i = 0; i < size; ++i)
-    putc ('-', stderr);
-  fputs ("'\n", stderr);
-
-  /* End title. */
-  fprintf (stderr, "%s END\n\n", title);
-}
 \f
 /*------------------------------------------------------------------.
 | Set FIRSTS to be an NVARS array of NVARS bitsets indicating which |
 \f
 /*------------------------------------------------------------------.
 | Set FIRSTS to be an NVARS array of NVARS bitsets indicating which |
@@ -174,25 +123,25 @@ bitmatrix_print (const char *title, bitsetv matrix)
 static void
 set_firsts (void)
 {
 static void
 set_firsts (void)
 {
-  int i, j;
+  symbol_number i, j;
 
   firsts = bitsetv_create (nvars, nvars, BITSET_FIXED);
 
   for (i = ntokens; i < nsyms; i++)
 
   firsts = bitsetv_create (nvars, nvars, BITSET_FIXED);
 
   for (i = ntokens; i < nsyms; i++)
-    for (j = 0; derives[i][j] >= 0; ++j)
+    for (j = 0; derives[i - ntokens][j]; ++j)
       {
       {
-       int symbol = rules[derives[i][j]].rhs[0];
-       if (ISVAR (symbol))
-         bitset_set (FIRSTS (i), symbol - ntokens);
+       item_number sym = derives[i - ntokens][j]->rhs[0];
+       if (ISVAR (sym))
+         bitset_set (FIRSTS (i), sym - ntokens);
       }
 
       }
 
-  if (trace_flag)
-    bitmatrix_print ("RTC: Input", firsts);
+  if (trace_flag & trace_sets)
+    bitsetv_matrix_dump (stderr, "RTC: Firsts Input", firsts);
   bitsetv_reflexive_transitive_closure (firsts);
   bitsetv_reflexive_transitive_closure (firsts);
-  if (trace_flag)
-    bitmatrix_print ("RTC: Output", firsts);
+  if (trace_flag & trace_sets)
+    bitsetv_matrix_dump (stderr, "RTC: Firsts Output", firsts);
 
 
-  if (trace_flag)
+  if (trace_flag & trace_sets)
     print_firsts ();
 }
 
     print_firsts ();
 }
 
@@ -209,31 +158,33 @@ set_firsts (void)
 static void
 set_fderives (void)
 {
 static void
 set_fderives (void)
 {
-  int i, j, k;
+  symbol_number i, j;
+  rule_number k;
 
 
-  fderives = bitsetv_create (nvars, nrules + 1, BITSET_FIXED);
+  fderives = bitsetv_create (nvars, nrules, BITSET_FIXED);
 
   set_firsts ();
 
   for (i = ntokens; i < nsyms; ++i)
     for (j = ntokens; j < nsyms; ++j)
       if (bitset_test (FIRSTS (i), j - ntokens))
 
   set_firsts ();
 
   for (i = ntokens; i < nsyms; ++i)
     for (j = ntokens; j < nsyms; ++j)
       if (bitset_test (FIRSTS (i), j - ntokens))
-       for (k = 0; derives[j][k] > 0; ++k)
-         bitset_set (FDERIVES (i), derives[j][k]);
+       for (k = 0; derives[j - ntokens][k]; ++k)
+         bitset_set (FDERIVES (i), derives[j - ntokens][k]->number);
 
 
-  if (trace_flag)
+  if (trace_flag & trace_sets)
     print_fderives ();
 
   bitsetv_free (firsts);
 }
     print_fderives ();
 
   bitsetv_free (firsts);
 }
+
 \f
 
 void
 new_closure (int n)
 {
 \f
 
 void
 new_closure (int n)
 {
-  itemset = XCALLOC (short, n);
+  CALLOC (itemset, n);
 
 
-  ruleset = bitset_create (nrules + 1, BITSET_FIXED);
+  ruleset = bitset_create (nrules, BITSET_FIXED);
 
   set_fderives ();
 }
 
   set_fderives ();
 }
@@ -241,15 +192,17 @@ new_closure (int n)
 
 
 void
 
 
 void
-closure (short *core, int n)
+closure (item_number *core, int n)
 {
   /* Index over CORE. */
   int c;
 
   /* A bit index over RULESET. */
 {
   /* Index over CORE. */
   int c;
 
   /* A bit index over RULESET. */
-  int ruleno;
+  rule_number ruleno;
 
 
-  if (trace_flag)
+  bitset_iterator iter;
+
+  if (trace_flag & trace_sets)
     print_closure ("input", core, n);
 
   bitset_zero (ruleset);
     print_closure ("input", core, n);
 
   bitset_zero (ruleset);
@@ -258,31 +211,30 @@ closure (short *core, int n)
     if (ISVAR (ritem[core[c]]))
       bitset_or (ruleset, ruleset, FDERIVES (ritem[core[c]]));
 
     if (ISVAR (ritem[core[c]]))
       bitset_or (ruleset, ruleset, FDERIVES (ritem[core[c]]));
 
-  nitemset = 0;
+  nritemset = 0;
   c = 0;
   c = 0;
-  for (ruleno = 0; ruleno < nrules + 1; ++ruleno)
-    if (bitset_test (ruleset, ruleno))
-      {
-       int itemno = rules[ruleno].rhs - ritem;
-       while (c < n && core[c] < itemno)
-         {
-           itemset[nitemset] = core[c];
-           nitemset++;
-           c++;
-         }
-       itemset[nitemset] = itemno;
-       nitemset++;
-      }
+  BITSET_FOR_EACH (iter, ruleset, ruleno, 0)
+    {
+      item_number itemno = rules[ruleno].rhs - ritem;
+      while (c < n && core[c] < itemno)
+       {
+         itemset[nritemset] = core[c];
+         nritemset++;
+         c++;
+       }
+      itemset[nritemset] = itemno;
+      nritemset++;
+    };
 
   while (c < n)
     {
 
   while (c < n)
     {
-      itemset[nitemset] = core[c];
-      nitemset++;
+      itemset[nritemset] = core[c];
+      nritemset++;
       c++;
     }
 
       c++;
     }
 
-  if (trace_flag)
-    print_closure ("output", itemset, nitemset);
+  if (trace_flag & trace_sets)
+    print_closure ("output", itemset, nritemset);
 }
 
 
 }