]> git.saurik.com Git - bison.git/blobdiff - src/closure.c
* src/closure.c (closure): Use arrays instead of pointers to clarify.
[bison.git] / src / closure.c
index 31073257970bd2b0575fd252b322f90e0bb97054..09d835002645d855dc801728866291ca26e6cdf5 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"
-
-extern short **derives;
-extern char **tags;
-
-extern void RTC PARAMS ((unsigned *, int));
+#include "derives.h"
+#include "warshall.h"
 
 short *itemset;
 short *itemsetend;
 
 short *itemset;
 short *itemsetend;
@@ -37,13 +34,15 @@ static unsigned *ruleset;
 static unsigned *fderives;
 static unsigned *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.  |
@@ -54,9 +53,10 @@ print_closure (int n)
 {
   short *isp;
 
 {
   short *isp;
 
-  printf ("\n\nn = %d\n\n", n);
+  fprintf (stderr, "n = %d\n", n);
   for (isp = itemset; isp < itemsetend; isp++)
   for (isp = itemset; isp < itemsetend; isp++)
-    printf ("   %d\n", *isp);
+    fprintf (stderr, "   %d\n", *isp);
+  fprintf (stderr, "\n\n");
 }
 
 
 }
 
 
@@ -67,18 +67,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 +90,19 @@ 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);
+         fprintf (stderr, "\t\t%d (%s)\n", j, tags[j]);
     }
     }
-
-  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     |
@@ -127,7 +126,7 @@ set_firsts (void)
 
   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++)
 
   row = firsts;
   for (i = ntokens; i < nsyms; i++)
@@ -135,7 +134,7 @@ set_firsts (void)
       sp = derives[i];
       while (*sp >= 0)
        {
       sp = derives[i];
       while (*sp >= 0)
        {
-         symbol = ritem[rrhs[*sp++]];
+         symbol = ritem[rule_table[*sp++].rhs];
          if (ISVAR (symbol))
            {
              symbol -= ntokens;
          if (ISVAR (symbol))
            {
              symbol -= ntokens;
@@ -148,9 +147,8 @@ set_firsts (void)
 
   RTC (firsts, nvars);
 
 
   RTC (firsts, nvars);
 
-#ifdef DEBUG
-  print_firsts ();
-#endif
+  if (trace_flag)
+    print_firsts ();
 }
 
 /*-------------------------------------------------------------------.
 }
 
 /*-------------------------------------------------------------------.
@@ -176,15 +174,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 +191,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 +205,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 ();
 }
@@ -234,41 +229,37 @@ void
 closure (short *core, int n)
 {
   int ruleno;
 closure (short *core, int n)
 {
   int ruleno;
-  unsigned word;
   short *csp;
   short *csp;
-  unsigned *dsp;
-  unsigned *rsp;
 
 
-  short *csend;
-  unsigned *rsend;
-  int symbol;
   int itemno;
   int itemno;
+  int i;
 
 
-  rsp = ruleset;
-  rsend = ruleset + rulesetsize;
-  csend = core + n;
+  if (trace_flag)
+    {
+      fprintf (stderr, "Entering closure (items = {");
+      for (i = 0; i < n; ++i)
+       fprintf (stderr, " %d ", core[i]);
+      fprintf (stderr, "}, nitems = %d)\n", n);
+    }
 
   if (n == 0)
     {
 
   if (n == 0)
     {
-      dsp = fderives + start_symbol * rulesetsize;
-      while (rsp < rsend)
-       *rsp++ = *dsp++;
+      for (i = 0; i < rulesetsize; ++i)
+       ruleset[i] = FDERIVES (start_symbol)[i];
     }
   else
     {
     }
   else
     {
-      while (rsp < rsend)
-       *rsp++ = 0;
+      for (i = 0; i < rulesetsize; ++i)
+       ruleset[i] = 0;
 
 
-      csp = core;
-      while (csp < csend)
+      for (i = 0; i < n; ++i)
        {
        {
-         symbol = ritem[*csp++];
+         int symbol = ritem[core[i]];
          if (ISVAR (symbol))
            {
          if (ISVAR (symbol))
            {
-             dsp = fderives + symbol * rulesetsize;
-             rsp = ruleset;
-             while (rsp < rsend)
-               *rsp++ |= *dsp++;
+             int j;
+             for (j = 0; j < rulesetsize; ++j)
+               ruleset[j] |= FDERIVES (symbol)[j];
            }
        }
     }
            }
        }
     }
@@ -276,10 +267,9 @@ closure (short *core, int n)
   ruleno = 0;
   itemsetend = itemset;
   csp = core;
   ruleno = 0;
   itemsetend = itemset;
   csp = core;
-  rsp = ruleset;
-  while (rsp < rsend)
+  for (i= 0; i < rulesetsize; ++i)
     {
     {
-      word = *rsp++;
+      int word = ruleset[i];
       if (word == 0)
        {
          ruleno += BITS_PER_WORD;
       if (word == 0)
        {
          ruleno += BITS_PER_WORD;
@@ -292,8 +282,8 @@ closure (short *core, int n)
            {
              if (word & (1 << b))
                {
            {
              if (word & (1 << b))
                {
-                 itemno = rrhs[ruleno];
-                 while (csp < csend && *csp < itemno)
+                 itemno = rule_table[ruleno].rhs;
+                 while (csp < (core + n ) && *csp < itemno)
                    *itemsetend++ = *csp++;
                  *itemsetend++ = itemno;
                }
                    *itemsetend++ = *csp++;
                  *itemsetend++ = itemno;
                }
@@ -303,19 +293,18 @@ closure (short *core, int n)
        }
     }
 
        }
     }
 
-  while (csp < csend)
+  while (csp < (core + n))
     *itemsetend++ = *csp++;
 
     *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);
 }
 }