]> git.saurik.com Git - bison.git/blobdiff - src/derives.c
New file: skeleton for GLR (Generalized LR) parser.
[bison.git] / src / derives.c
index 49b4edff13f47eff439836cc3fb95a9c7bf10ab5..d78d55633bbeec07ae4d7de6b2544d0ab2fb721b 100644 (file)
@@ -1,5 +1,5 @@
 /* Match rules with nonterminals for bison,
 /* Match rules with nonterminals for bison,
-   Copyright 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;
 
 
-  fputs ("\n\n\n", stdout);
-  printf (_("DERIVES"));
-  fputs ("\n\n", stdout);
+  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);
+         item_number_t *rhsp;
+         fprintf (stderr, "\t\t%d:", *sp);
+         for (rhsp = 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;
@@ -75,14 +69,11 @@ 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++;
-       }
+      symbol_number_t lhs = rules[i].lhs->number;
+      p->next = dset[lhs];
+      p->value = i;
+      dset[lhs] = p;
+      p++;
     }
 
   derives = XCALLOC (short *, nvars) - ntokens;
     }
 
   derives = XCALLOC (short *, nvars) - ntokens;
@@ -100,9 +91,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);