]> git.saurik.com Git - bison.git/blobdiff - src/closure.c
* src/bison.simple: Remove YYERROR_VERBOSE using.
[bison.git] / src / closure.c
index 87ad8c5f5f054abc6e2a24d8bdedaf3bc7ba5da4..593aedf8fd64448985d79199288d4430a16fad4a 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 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.  |
@@ -51,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");
 }
 
 
 }
 
 
@@ -66,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");
 }
 
 
 }
 
 
@@ -88,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     |
@@ -126,7 +133,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++)
@@ -134,7 +141,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;
@@ -147,9 +154,8 @@ set_firsts (void)
 
   RTC (firsts, nvars);
 
 
   RTC (firsts, nvars);
 
-#ifdef DEBUG
-  print_firsts ();
-#endif
+  if (trace_flag)
+    print_firsts ();
 }
 
 /*-------------------------------------------------------------------.
 }
 
 /*-------------------------------------------------------------------.
@@ -175,15 +181,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++)
@@ -192,9 +198,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++;
@@ -208,21 +212,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,52 +236,47 @@ 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];
            }
        }
     }
 
   ruleno = 0;
            }
        }
     }
 
   ruleno = 0;
-  itemsetend = itemset;
+  itemsetsize = 0;
   csp = core;
   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;
@@ -291,10 +289,10 @@ closure (short *core, int n)
            {
              if (word & (1 << b))
                {
            {
              if (word & (1 << b))
                {
-                 itemno = rrhs[ruleno];
-                 while (csp < csend && *csp < itemno)
-                   *itemsetend++ = *csp++;
-                 *itemsetend++ = itemno;
+                 itemno = rule_table[ruleno].rhs;
+                 while (csp < (core + n) && *csp < itemno)
+                   itemset[itemsetsize++] = *csp++;
+                 itemset[itemsetsize++] = itemno;
                }
 
              ruleno++;
                }
 
              ruleno++;
@@ -302,19 +300,18 @@ closure (short *core, int n)
        }
     }
 
        }
     }
 
-  while (csp < csend)
-    *itemsetend++ = *csp++;
+  while (csp < (core + n))
+    itemset[itemsetsize++] = *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);
 }
 }