]> git.saurik.com Git - bison.git/blobdiff - src/derives.c
Regen.
[bison.git] / src / derives.c
index 9bd37c92d02acb9efb023871fd97c615c7d24a5d..795bc08e88c3cf1a019e3ca4918197c9c193ef56 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 "symtab.h"
 #include "types.h"
 #include "types.h"
+#include "reader.h"
 #include "gram.h"
 #include "derives.h"
 
 #include "gram.h"
 #include "derives.h"
 
-short **derives;
-
-#if DEBUG
+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", symbols[i]->tag);
       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[rules[*sp].rhs]; *rhsp >= 0; ++rhsp)
+           fprintf (stderr, " %s", symbols[*rhsp]->tag);
+         fprintf (stderr, " (rule %d)\n", -*rhsp - 1);
        }
        }
-      putchar ('\n');
     }
 
     }
 
-  putchar ('\n');
+  fputs ("\n\n", stderr);
 }
 
 }
 
-#endif
 
 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 (rules[i].useful)
+      {
+       int lhs = rules[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++)
     {
@@ -98,17 +92,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);
 }
 }