]> git.saurik.com Git - bison.git/blobdiff - src/closure.c
Regen.
[bison.git] / src / closure.c
index 31073257970bd2b0575fd252b322f90e0bb97054..d24e2eab73dc6574c434accd111a3b76a01cf438 100644 (file)
@@ -1,5 +1,5 @@
 /* Subroutines for bison
 /* Subroutines for bison
-   Copyright (C) 1984, 1989, 2000 Free Software Foundation, Inc.
+   Copyright 1984, 1989, 2000, 2001 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  */
 
    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  */
 
-
 #include "system.h"
 #include "system.h"
-#include "alloc.h"
+#include "getargs.h"
+#include "symtab.h"
 #include "gram.h"
 #include "gram.h"
+#include "reader.h"
 #include "closure.h"
 #include "closure.h"
+#include "derives.h"
+#include "warshall.h"
 
 
-extern short **derives;
-extern char **tags;
-
-extern void RTC PARAMS ((unsigned *, int));
-
+/* NITEMSET is the size of the array ITEMSET.  */
 short *itemset;
 short *itemset;
-short *itemsetend;
+int nitemset;
+
 static unsigned *ruleset;
 
 /* internal data.  See comments before set_fderives and set_firsts.  */
 static unsigned *fderives;
 static unsigned *firsts;
 
 static unsigned *ruleset;
 
 /* internal data.  See comments before set_fderives and set_firsts.  */
 static unsigned *fderives;
 static unsigned *firsts;
 
+/* Retrieve the FDERIVES/FIRSTS sets of the nonterminals numbered Var.  */
+#define FDERIVES(Var)   (fderives + ((Var) - ntokens) * rulesetsize)
+#define   FIRSTS(Var)   (firsts   + ((Var) - ntokens) * varsetsize)
+
 /* number of words required to hold a bit for each rule */
 static int rulesetsize;
 
 /* number of words required to hold a bit for each variable */
 static int varsetsize;
 \f
 /* number of words required to hold a bit for each rule */
 static int rulesetsize;
 
 /* number of words required to hold a bit for each variable */
 static int varsetsize;
 \f
-#if DEBUG
 
 /*-----------------.
 | Debugging code.  |
 `-----------------*/
 
 static void
 
 /*-----------------.
 | Debugging code.  |
 `-----------------*/
 
 static void
-print_closure (int n)
+print_closure (const char *title, short *array, size_t size)
 {
 {
-  short *isp;
-
-  printf ("\n\nn = %d\n\n", n);
-  for (isp = itemset; isp < itemsetend; isp++)
-    printf ("   %d\n", *isp);
+  size_t i;
+  fprintf (stderr, "Closure: %s\n", title);
+  for (i = 0; i < size; ++i)
+    {
+      short *rp;
+      fprintf (stderr, "  %2d: .", array[i]);
+      for (rp = &ritem[array[i]]; *rp >= 0; ++rp)
+       fprintf (stderr, " %s", symbols[*rp]->tag);
+      fprintf (stderr, "  (rule %d)\n", -*rp - 1);
+    }
+  fputs ("\n\n", stderr);
 }
 
 
 static void
 print_firsts (void)
 {
 }
 
 
 static void
 print_firsts (void)
 {
-  int i;
-  int j;
-  unsigned *rowp;
-
-  printf ("\n\n\nFIRSTS\n\n");
+  int i, j;
 
 
+  fprintf (stderr, "FIRSTS\n");
   for (i = ntokens; i < nsyms; i++)
     {
   for (i = ntokens; i < nsyms; i++)
     {
-      printf ("\n\n%s firsts\n\n", tags[i]);
-
-      rowp = firsts + ((i - ntokens) * varsetsize);
-
+      fprintf (stderr, "\t%s firsts\n", symbols[i]->tag);
       for (j = 0; j < nvars; j++)
       for (j = 0; j < nvars; j++)
-       if (BITISSET (rowp, j))
-         printf ("   %s\n", tags[j + ntokens]);
+       if (BITISSET (FIRSTS (i), j))
+         fprintf (stderr, "\t\t%d (%s)\n",
+                  j + ntokens, symbols[j + ntokens]->tag);
     }
     }
+  fprintf (stderr, "\n\n");
 }
 
 
 }
 
 
@@ -87,23 +92,24 @@ print_fderives (void)
 {
   int i;
   int j;
 {
   int i;
   int j;
-  unsigned *rp;
 
 
-  printf ("\n\n\nFDERIVES\n");
+  fprintf (stderr, "FDERIVES\n");
 
   for (i = ntokens; i < nsyms; i++)
     {
 
   for (i = ntokens; i < nsyms; i++)
     {
-      printf ("\n\n%s derives\n\n", tags[i]);
-      rp = fderives + i * rulesetsize;
-
+      fprintf (stderr, "\t%s derives\n", symbols[i]->tag);
       for (j = 0; j <= nrules; j++)
       for (j = 0; j <= nrules; j++)
-       if (BITISSET (rp, j))
-         printf ("   %d\n", j);
+       if (BITISSET (FDERIVES (i), j))
+         {
+           short *rhsp;
+           fprintf (stderr, "\t\t%d:", j - 1);
+           for (rhsp = &ritem[rules[j].rhs]; *rhsp >= 0; ++rhsp)
+             fprintf (stderr, " %s", symbols[*rhsp]->tag);
+           fputc ('\n', stderr);
+         }
     }
     }
-
-  fflush (stdout);
+  fprintf (stderr, "\n\n");
 }
 }
-#endif
 \f
 /*-------------------------------------------------------------------.
 | Set FIRSTS to be an NVARS by NVARS bit matrix indicating which     |
 \f
 /*-------------------------------------------------------------------.
 | Set FIRSTS to be an NVARS by NVARS bit matrix indicating which     |
@@ -118,39 +124,24 @@ print_fderives (void)
 static void
 set_firsts (void)
 {
 static void
 set_firsts (void)
 {
-  unsigned *row;
-  int symbol;
-  short *sp;
-  int rowsize;
-
-  int i;
+  int i, j;
 
 
-  varsetsize = rowsize = WORDSIZE (nvars);
+  varsetsize = WORDSIZE (nvars);
 
 
-  firsts = NEW2 (nvars * rowsize, unsigned);
+  firsts = XCALLOC (unsigned, nvars * varsetsize);
 
 
-  row = firsts;
   for (i = ntokens; i < nsyms; i++)
   for (i = ntokens; i < nsyms; i++)
-    {
-      sp = derives[i];
-      while (*sp >= 0)
-       {
-         symbol = ritem[rrhs[*sp++]];
-         if (ISVAR (symbol))
-           {
-             symbol -= ntokens;
-             SETBIT (row, symbol);
-           }
-       }
-
-      row += rowsize;
-    }
+    for (j = 0; derives[i][j] >= 0; ++j)
+      {
+       int symbol = ritem[rules[derives[i][j]].rhs];
+       if (ISVAR (symbol))
+         SETBIT (FIRSTS (i), symbol - ntokens);
+      }
 
   RTC (firsts, nvars);
 
 
   RTC (firsts, nvars);
 
-#ifdef DEBUG
-  print_firsts ();
-#endif
+  if (trace_flag)
+    print_firsts ();
 }
 
 /*-------------------------------------------------------------------.
 }
 
 /*-------------------------------------------------------------------.
@@ -166,64 +157,32 @@ set_firsts (void)
 static void
 set_fderives (void)
 {
 static void
 set_fderives (void)
 {
-  unsigned *rrow;
-  unsigned *vrow;
-  int j;
-  unsigned cword;
-  short *rp;
-  int b;
+  int i, j, k;
 
 
-  int ruleno;
-  int i;
-
-  fderives = NEW2 (nvars * rulesetsize, unsigned) - ntokens * rulesetsize;
+  fderives = XCALLOC (unsigned, nvars * rulesetsize);
 
   set_firsts ();
 
 
   set_firsts ();
 
-  rrow = fderives + ntokens * rulesetsize;
-
-  for (i = ntokens; i < nsyms; i++)
-    {
-      vrow = firsts + ((i - ntokens) * varsetsize);
-      cword = *vrow++;
-      b = 0;
-      for (j = ntokens; j < nsyms; j++)
-       {
-         if (cword & (1 << b))
-           {
-             rp = derives[j];
-             while ((ruleno = *rp++) > 0)
-               {
-                 SETBIT (rrow, ruleno);
-               }
-           }
-
-         b++;
-         if (b >= BITS_PER_WORD && j + 1 < nsyms)
-           {
-             cword = *vrow++;
-             b = 0;
-           }
-       }
-
-      rrow += rulesetsize;
-    }
+  for (i = ntokens; i < nsyms; ++i)
+    for (j = ntokens; j < nsyms; ++j)
+      if (BITISSET (FIRSTS (i), j - ntokens))
+       for (k = 0; derives[j][k] > 0; ++k)
+         SETBIT (FDERIVES (i), derives[j][k]);
 
 
-#ifdef DEBUG
-  print_fderives ();
-#endif
+  if (trace_flag)
+    print_fderives ();
 
 
-  FREE (firsts);
+  XFREE (firsts);
 }
 \f
 
 void
 new_closure (int n)
 {
 }
 \f
 
 void
 new_closure (int n)
 {
-  itemset = NEW2 (n, short);
+  itemset = XCALLOC (short, n);
 
   rulesetsize = WORDSIZE (nrules + 1);
 
   rulesetsize = WORDSIZE (nrules + 1);
-  ruleset = NEW2 (rulesetsize, unsigned);
+  ruleset = XCALLOC (unsigned, rulesetsize);
 
   set_fderives ();
 }
 
   set_fderives ();
 }
@@ -233,89 +192,66 @@ new_closure (int n)
 void
 closure (short *core, int n)
 {
 void
 closure (short *core, int n)
 {
-  int ruleno;
-  unsigned word;
-  short *csp;
-  unsigned *dsp;
-  unsigned *rsp;
+  /* Index over CORE. */
+  int c;
 
 
-  short *csend;
-  unsigned *rsend;
-  int symbol;
-  int itemno;
+  /* Index over RULESET. */
+  int r;
 
 
-  rsp = ruleset;
-  rsend = ruleset + rulesetsize;
-  csend = core + n;
+  /* A bit index over RULESET. */
+  int ruleno;
+
+  if (trace_flag)
+    print_closure ("input", core, n);
 
   if (n == 0)
     {
 
   if (n == 0)
     {
-      dsp = fderives + start_symbol * rulesetsize;
-      while (rsp < rsend)
-       *rsp++ = *dsp++;
+      for (r = 0; r < rulesetsize; ++r)
+       ruleset[r] = FDERIVES (start_symbol)[r];
     }
   else
     {
     }
   else
     {
-      while (rsp < rsend)
-       *rsp++ = 0;
-
-      csp = core;
-      while (csp < csend)
-       {
-         symbol = ritem[*csp++];
-         if (ISVAR (symbol))
-           {
-             dsp = fderives + symbol * rulesetsize;
-             rsp = ruleset;
-             while (rsp < rsend)
-               *rsp++ |= *dsp++;
-           }
-       }
+      for (r = 0; r < rulesetsize; ++r)
+       ruleset[r] = 0;
+
+      for (c = 0; c < n; ++c)
+       if (ISVAR (ritem[core[c]]))
+         for (r = 0; r < rulesetsize; ++r)
+           ruleset[r] |= FDERIVES (ritem[core[c]])[r];
     }
 
     }
 
-  ruleno = 0;
-  itemsetend = itemset;
-  csp = core;
-  rsp = ruleset;
-  while (rsp < rsend)
+  nitemset = 0;
+  c = 0;
+  for (ruleno = 0; ruleno < nrules + 1; ++ruleno)
+    if (BITISSET (ruleset, ruleno))
+      {
+       int itemno = rules[ruleno].rhs;
+       while (c < n && core[c] < itemno)
+         {
+           itemset[nitemset] = core[c];
+           nitemset++;
+           c++;
+         }
+       itemset[nitemset] = itemno;
+       nitemset++;
+      }
+
+  while (c < n)
     {
     {
-      word = *rsp++;
-      if (word == 0)
-       {
-         ruleno += BITS_PER_WORD;
-       }
-      else
-       {
-         int b;
-
-         for (b = 0; b < BITS_PER_WORD; b++)
-           {
-             if (word & (1 << b))
-               {
-                 itemno = rrhs[ruleno];
-                 while (csp < csend && *csp < itemno)
-                   *itemsetend++ = *csp++;
-                 *itemsetend++ = itemno;
-               }
-
-             ruleno++;
-           }
-       }
+      itemset[nitemset] = core[c];
+      nitemset++;
+      c++;
     }
 
     }
 
-  while (csp < csend)
-    *itemsetend++ = *csp++;
-
-#if DEBUG
-  print_closure (n);
-#endif
+  if (trace_flag)
+    print_closure ("output", itemset, nitemset);
 }
 
 
 void
 free_closure (void)
 {
 }
 
 
 void
 free_closure (void)
 {
-  FREE (itemset);
-  FREE (ruleset);
-  FREE (fderives + ntokens * rulesetsize);
+  XFREE (itemset);
+  XFREE (ruleset);
+  XFREE (fderives);
 }
 }