]> git.saurik.com Git - bison.git/blobdiff - src/closure.c
* src/closure.c (set_firsts): De-obfuscate.
[bison.git] / src / closure.c
index 31073257970bd2b0575fd252b322f90e0bb97054..849b0b6288a5d13c3e167fb2be45f38064053d9f 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 "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));
-
+/* ITEMSETSIZE is the size of the array ITEMSET.  */
 short *itemset;
 short *itemset;
-short *itemsetend;
+int itemsetsize;
+
 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;
 
+#define FDERIVES(Symbol)   (fderives + (Symbol) * rulesetsize)
+#define   FIRSTS(Symbol)   (firsts   + (Symbol) * 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.  |
 
 /*-----------------.
 | Debugging code.  |
@@ -52,11 +53,11 @@ static int varsetsize;
 static void
 print_closure (int n)
 {
 static void
 print_closure (int n)
 {
-  short *isp;
-
-  printf ("\n\nn = %d\n\n", n);
-  for (isp = itemset; isp < itemsetend; isp++)
-    printf ("   %d\n", *isp);
+  int i;
+  fprintf (stderr, "n = %d\n", n);
+  for (i = 0; i < itemsetsize; ++i)
+    fprintf (stderr, "   %d\n", itemset[i]);
+  fprintf (stderr, "\n\n");
 }
 
 
 }
 
 
@@ -67,18 +68,19 @@ print_firsts (void)
   int j;
   unsigned *rowp;
 
   int j;
   unsigned *rowp;
 
-  printf ("\n\n\nFIRSTS\n\n");
+  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]);
+      fprintf (stderr, "\t%s firsts\n", tags[i]);
 
 
-      rowp = firsts + ((i - ntokens) * varsetsize);
+      rowp = FIRSTS (i - ntokens);
 
       for (j = 0; j < nvars; j++)
        if (BITISSET (rowp, j))
 
       for (j = 0; j < nvars; j++)
        if (BITISSET (rowp, j))
-         printf ("   %s\n", tags[j + ntokens]);
+         fprintf (stderr, "\t\t%d (%s)\n", j + ntokens, tags[j + ntokens]);
     }
     }
+  fprintf (stderr, "\n\n");
 }
 
 
 }
 
 
@@ -89,21 +91,25 @@ print_fderives (void)
   int j;
   unsigned *rp;
 
   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", tags[i]);
+      rp = FDERIVES (i);
 
       for (j = 0; j <= nrules; j++)
        if (BITISSET (rp, j))
 
       for (j = 0; j <= nrules; j++)
        if (BITISSET (rp, j))
-         printf ("   %d\n", j);
+         {
+           short *rhsp;
+           fprintf (stderr, "\t\t%d:", j);
+           for (rhsp = ritem + rule_table[j].rhs; *rhsp > 0; ++rhsp)
+             fprintf (stderr, " %s", tags[*rhsp]);
+           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,29 @@ print_fderives (void)
 static void
 set_firsts (void)
 {
 static void
 set_firsts (void)
 {
-  unsigned *row;
-  int symbol;
-  short *sp;
   int rowsize;
 
   int rowsize;
 
-  int i;
+  int i, j;
 
   varsetsize = rowsize = WORDSIZE (nvars);
 
 
   varsetsize = rowsize = WORDSIZE (nvars);
 
-  firsts = NEW2 (nvars * rowsize, unsigned);
+  firsts = XCALLOC (unsigned, nvars * rowsize);
 
 
-  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[rule_table[derives[i][j]].rhs];
+       if (ISVAR (symbol))
+         {
+           symbol -= ntokens;
+           SETBIT (FIRSTS (i - ntokens), symbol);
+         }
+      }
 
   RTC (firsts, nvars);
 
 
   RTC (firsts, nvars);
 
-#ifdef DEBUG
-  print_firsts ();
-#endif
+  if (trace_flag)
+    print_firsts ();
 }
 
 /*-------------------------------------------------------------------.
 }
 
 /*-------------------------------------------------------------------.
@@ -176,15 +172,15 @@ set_fderives (void)
   int ruleno;
   int i;
 
   int ruleno;
   int i;
 
-  fderives = NEW2 (nvars * rulesetsize, unsigned) - ntokens * rulesetsize;
+  fderives = XCALLOC (unsigned, nvars * rulesetsize) - ntokens * rulesetsize;
 
   set_firsts ();
 
 
   set_firsts ();
 
-  rrow = fderives + ntokens * rulesetsize;
+  rrow = FDERIVES (ntokens);
 
   for (i = ntokens; i < nsyms; i++)
     {
 
   for (i = ntokens; i < nsyms; i++)
     {
-      vrow = firsts + ((i - ntokens) * varsetsize);
+      vrow = FIRSTS (i - ntokens);
       cword = *vrow++;
       b = 0;
       for (j = ntokens; j < nsyms; j++)
       cword = *vrow++;
       b = 0;
       for (j = ntokens; j < nsyms; j++)
@@ -193,9 +189,7 @@ set_fderives (void)
            {
              rp = derives[j];
              while ((ruleno = *rp++) > 0)
            {
              rp = derives[j];
              while ((ruleno = *rp++) > 0)
-               {
-                 SETBIT (rrow, ruleno);
-               }
+               SETBIT (rrow, ruleno);
            }
 
          b++;
            }
 
          b++;
@@ -209,21 +203,20 @@ set_fderives (void)
       rrow += rulesetsize;
     }
 
       rrow += rulesetsize;
     }
 
-#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 +226,71 @@ 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)
+    {
+      fprintf (stderr, "Entering closure (items = {");
+      for (c = 0; c < n; ++c)
+       fprintf (stderr, " %d ", core[c]);
+      fprintf (stderr, "})\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;
+      for (r = 0; r < rulesetsize; ++r)
+       ruleset[r] = 0;
 
 
-      csp = core;
-      while (csp < csend)
-       {
-         symbol = ritem[*csp++];
-         if (ISVAR (symbol))
-           {
-             dsp = fderives + symbol * rulesetsize;
-             rsp = ruleset;
-             while (rsp < rsend)
-               *rsp++ |= *dsp++;
-           }
-       }
+      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)
+  itemsetsize = 0;
+  c = 0;
+  for (ruleno = 0; ruleno < rulesetsize * BITS_PER_WORD; ++ruleno)
+    if (BITISSET (ruleset, ruleno))
+      {
+       int itemno = rule_table[ruleno].rhs;
+       while (c < n && core[c] < itemno)
+         {
+           itemset[itemsetsize] = core[c];
+           itemsetsize++;
+           c++;
+         }
+       itemset[itemsetsize] = itemno;
+       itemsetsize++;
+      }
+
+  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[itemsetsize] = core[c];
+      itemsetsize++;
+      c++;
     }
 
     }
 
-  while (csp < csend)
-    *itemsetend++ = *csp++;
-
-#if DEBUG
-  print_closure (n);
-#endif
+  if (trace_flag)
+    print_closure (n);
 }
 
 
 void
 free_closure (void)
 {
 }
 
 
 void
 free_closure (void)
 {
-  FREE (itemset);
-  FREE (ruleset);
-  FREE (fderives + ntokens * rulesetsize);
+  XFREE (itemset);
+  XFREE (ruleset);
+  XFREE (fderives + ntokens * rulesetsize);
 }
 }