]> git.saurik.com Git - bison.git/blobdiff - src/derives.c
Fix the previous test.
[bison.git] / src / derives.c
index b5aaa2fb20ea093cbcbd7c4742ebdf987ee25d9b..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 "xalloc.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)
 {
   int i;
 
 static void
 print_derives (void)
 {
   int i;
-  short *sp;
 
 
-  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)
 {
   int i;
 
 void
 set_derives (void)
 {
   int i;
-  int lhs;
   shorts *p;
   short *q;
   shorts **dset;
   shorts *p;
   short *q;
   shorts **dset;
@@ -72,16 +68,14 @@ set_derives (void)
 
   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++;
-       }
-    }
+    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);
 
   derives = XCALLOC (short *, nvars) - ntokens;
   q = XCALLOC (short, nvars + nrules);
@@ -98,9 +92,8 @@ set_derives (void)
       *q++ = -1;
     }
 
       *q++ = -1;
     }
 
-#if DEBUG
-  print_derives ();
-#endif
+  if (trace_flag)
+    print_derives ();
 
   XFREE (dset + ntokens);
   XFREE (delts);
 
   XFREE (dset + ntokens);
   XFREE (delts);