]> git.saurik.com Git - bison.git/blobdiff - src/derives.c
* tests/regression.at, tests/torture.at, tests/calc.at: Adjust to
[bison.git] / src / derives.c
index 5f8637ca382a59753d710fbe829a74a3f3bd32cb..ab7cc32656f2f79bd890cf6f785d2ef8d5e743fc 100644 (file)
@@ -1,5 +1,5 @@
 /* Match rules with nonterminals for bison,
 /* Match rules with nonterminals 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.
 
    Boston, MA 02111-1307, USA.  */
 
 
    Boston, MA 02111-1307, USA.  */
 
 
-/* set_derives finds, for each variable (nonterminal), which rules can
-   derive it.  It sets up the value of derives so that derives[i -
-   ntokens] points to a vector of rule numbers, terminated with -1.
-   */
-
 #include "system.h"
 #include "system.h"
-#include "alloc.h"
+#include "getargs.h"
 #include "types.h"
 #include "types.h"
+#include "reader.h"
 #include "gram.h"
 #include "derives.h"
 
 #include "gram.h"
 #include "derives.h"
 
-#if DEBUG
-extern char **tags;
+short **derives = NULL;
 
 static void
 print_derives (void)
 {
 
 static void
 print_derives (void)
 {
-  register int i;
-  register short *sp;
+  int i;
 
 
-  printf (_("\n\n\nDERIVES\n\n"));
+  fputs ("DERIVES\n", stderr);
 
   for (i = ntokens; i < nsyms; i++)
     {
 
   for (i = ntokens; i < nsyms; i++)
     {
-      printf (_("%s derives"), tags[i]);
+      short *sp;
+      fprintf (stderr, "\t%s derives\n", tags[i]);
       for (sp = derives[i]; *sp > 0; sp++)
        {
       for (sp = derives[i]; *sp > 0; sp++)
        {
-         printf ("  %d", *sp);
+         short *rhsp;
+         fprintf (stderr, "\t\t%d:", *sp);
+         for (rhsp = ritem + rule_table[*sp].rhs; *rhsp > 0; ++rhsp)
+           fprintf (stderr, " %s", tags[*rhsp]);
+         fprintf (stderr, " (rule %d)\n", -*rhsp);
        }
        }
-      putchar ('\n');
     }
 
     }
 
-  putchar ('\n');
+  fputs ("\n\n", stderr);
 }
 
 }
 
-#endif
-
-short **derives;
 
 void
 set_derives (void)
 {
 
 void
 set_derives (void)
 {
-  register int i;
-  register int lhs;
-  register shorts *p;
-  register short *q;
-  register shorts **dset;
-  register shorts *delts;
+  int i;
+  shorts *p;
+  short *q;
+  shorts **dset;
+  shorts *delts;
 
 
-  dset = NEW2 (nvars, shorts *) - ntokens;
-  delts = NEW2 (nrules + 1, shorts);
+  dset = XCALLOC (shorts *, nvars) - ntokens;
+  delts = XCALLOC (shorts, nrules + 1);
 
   p = delts;
   for (i = nrules; i > 0; i--)
 
   p = delts;
   for (i = nrules; i > 0; i--)
-    {
-      lhs = rlhs[i];
-      if (lhs >= 0)
-       {
-         p->next = dset[lhs];
-         p->value = i;
-         dset[lhs] = p;
-         p++;
-       }
-    }
-
-  derives = NEW2 (nvars, short *) - ntokens;
-  q = NEW2 (nvars + nrules, short);
+    if (rule_table[i].useful)
+      {
+       int lhs = rule_table[i].lhs;
+       p->next = dset[lhs];
+       p->value = i;
+       dset[lhs] = p;
+       p++;
+      }
+
+  derives = XCALLOC (short *, nvars) - ntokens;
+  q = XCALLOC (short, nvars + nrules);
 
   for (i = ntokens; i < nsyms; i++)
     {
 
   for (i = ntokens; i < nsyms; i++)
     {
@@ -99,17 +91,16 @@ set_derives (void)
       *q++ = -1;
     }
 
       *q++ = -1;
     }
 
-#if DEBUG
-  print_derives ();
-#endif
+  if (trace_flag)
+    print_derives ();
 
 
-  FREE (dset + ntokens);
-  FREE (delts);
+  XFREE (dset + ntokens);
+  XFREE (delts);
 }
 
 void
 free_derives (void)
 {
 }
 
 void
 free_derives (void)
 {
-  FREE (derives[ntokens]);
-  FREE (derives + ntokens);
+  XFREE (derives[ntokens]);
+  XFREE (derives + ntokens);
 }
 }