bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

31-fyi-various.patch


From: Akim Demaille
Subject: 31-fyi-various.patch
Date: Mon, 19 Nov 2001 10:04:13 +0100

I would really like to find a means to have Bison output complete
description of the states, but it's quite delicate :( Actually, it
does not compute the complete set of items at all, it keeps only a
core which is enough, via closure, to compute all the missing items.
That's why you never see Bison issue a item with the dot at the
start.  That's also why the first state is never described.  I first
thought it was the only one, but in fact, it's simply that no item
with the dot in first position is output.

Well, maybe the right approach is not to try to make Bison compute
more complete sets of items (since that's a nice way to trying to
break something), but rather to have print.c and print_graph.c do the
job themselves.

Index: ChangeLog
from  Akim Demaille  <address@hidden>

        * src/closure.c, src/derives.c, src/nullable.c: Adjust various
        trace messages.
        * src/LR0.c: Likewise.
        (allocate_itemsets): Use arrays instead of pointers to clarify.

Index: src/LR0.c
--- src/LR0.c Sun, 18 Nov 2001 10:23:57 +0100 akim
+++ src/LR0.c Sun, 18 Nov 2001 11:46:32 +0100 akim
@@ -24,6 +24,7 @@

 #include "system.h"
 #include "getargs.h"
+#include "reader.h"
 #include "gram.h"
 #include "state.h"
 #include "complain.h"
@@ -61,8 +62,6 @@
 static void
 allocate_itemsets (void)
 {
-  short *itemp = NULL;
-  int symbol;
   int i;
   int count;
   short *symbol_count = NULL;
@@ -70,17 +69,12 @@
   count = 0;
   symbol_count = XCALLOC (short, nsyms);

-  itemp = ritem;
-  symbol = *itemp++;
-  while (symbol)
-    {
-      if (symbol > 0)
-       {
-         count++;
-         symbol_count[symbol]++;
-       }
-      symbol = *itemp++;
-    }
+  for (i = 0; ritem[i]; ++i)
+    if (ritem[i] > 0)
+      {
+       count++;
+       symbol_count[ritem[i]]++;
+      }

   /* See comments before new_itemsets.  All the vectors of items
      live inside KERNEL_ITEMS.  The number of active items after
@@ -149,7 +143,8 @@
   int shiftcount;

   if (trace_flag)
-    fprintf (stderr, "Entering new_itemsets, state = %d\n", nstates);
+    fprintf (stderr, "Entering new_itemsets, state = %d\n",
+            this_state->number);

   for (i = 0; i < nsyms; i++)
     kernel_end[i] = NULL;
@@ -192,8 +187,8 @@
   core *p;

   if (trace_flag)
-    fprintf (stderr, "Entering new_state, state = %d, symbol = %d\n",
-            nstates, symbol);
+    fprintf (stderr, "Entering new_state, state = %d, symbol = %d (%s)\n",
+            this_state->number, symbol, tags[symbol]);

   if (nstates >= MAXSHORT)
     fatal (_("too many states (max %d)"), MAXSHORT);
@@ -232,8 +227,8 @@
   int n = kernel_end[symbol] - kernel_base[symbol];

   if (trace_flag)
-    fprintf (stderr, "Entering get_state, state = %d, symbol = %d\n",
-            nstates, symbol);
+    fprintf (stderr, "Entering get_state, state = %d, symbol = %d (%s)\n",
+            this_state->number, symbol, tags[symbol]);

   /* Add up the target state's active item numbers to get a hash key.
      */
@@ -276,6 +271,9 @@
       state_table[key] = sp = new_state (symbol);
     }

+  if (trace_flag)
+    fprintf (stderr, "Exiting get_state => %d\n", sp->number);
+
   return sp->number;
 }

@@ -294,8 +292,8 @@
   int symbol;

   if (trace_flag)
-    fprintf (stderr, "Entering append_states\n");
-
+    fprintf (stderr, "Entering append_states, state = %d\n",
+            this_state->number);

   /* first sort shift_symbol into increasing order */

Index: src/closure.c
--- src/closure.c Sun, 18 Nov 2001 10:23:57 +0100 akim
+++ src/closure.c Sun, 18 Nov 2001 11:13:43 +0100 akim
@@ -34,6 +34,9 @@
 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;

@@ -50,9 +53,10 @@
 {
   short *isp;

-  fprintf (stderr, "\n\nn = %d\n\n", n);
+  fprintf (stderr, "n = %d\n", n);
   for (isp = itemset; isp < itemsetend; isp++)
     fprintf (stderr, "   %d\n", *isp);
+  fprintf (stderr, "\n\n");
 }


@@ -63,18 +67,19 @@
   int j;
   unsigned *rowp;

-  fprintf (stderr, "\n\n\nFIRSTS\n\n");
+  fprintf (stderr, "FIRSTS\n");

   for (i = ntokens; i < nsyms; i++)
     {
-      fprintf (stderr, "\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))
-         fprintf (stderr, "   %s\n", tags[j + ntokens]);
+         fprintf (stderr, "\t\t%d (%s)\n", j + ntokens, tags[j + ntokens]);
     }
+  fprintf (stderr, "\n\n");
 }


@@ -85,17 +90,18 @@
   int j;
   unsigned *rp;

-  fprintf (stderr, "\n\n\nFDERIVES\n");
+  fprintf (stderr, "FDERIVES\n");

   for (i = ntokens; i < nsyms; i++)
     {
-      fprintf (stderr, "\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))
-         fprintf (stderr, "   %d\n", j);
+         fprintf (stderr, "\t\t%d (%s)\n", j, tags[j]);
     }
+  fprintf (stderr, "\n\n");
 }
 
 /*-------------------------------------------------------------------.
@@ -172,11 +178,11 @@

   set_firsts ();

-  rrow = fderives + ntokens * rulesetsize;
+  rrow = FDERIVES (ntokens);

   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++)
@@ -185,9 +191,7 @@
            {
              rp = derives[j];
              while ((ruleno = *rp++) > 0)
-               {
-                 SETBIT (rrow, ruleno);
-               }
+               SETBIT (rrow, ruleno);
            }

          b++;
@@ -235,13 +239,22 @@
   int symbol;
   int itemno;

+  if (trace_flag)
+    {
+      int i;
+      fprintf (stderr, "Entering closure (items = {");
+      for (i = 0; i < n; ++i)
+       fprintf (stderr, " %d ", core[i]);
+      fprintf (stderr, "}, nitems = %d)\n", n);
+    }
+
   rsp = ruleset;
   rsend = ruleset + rulesetsize;
   csend = core + n;

   if (n == 0)
     {
-      dsp = fderives + start_symbol * rulesetsize;
+      dsp = FDERIVES (start_symbol);
       while (rsp < rsend)
        *rsp++ = *dsp++;
     }
@@ -256,7 +269,7 @@
          symbol = ritem[*csp++];
          if (ISVAR (symbol))
            {
-             dsp = fderives + symbol * rulesetsize;
+             dsp = FDERIVES (symbol);
              rsp = ruleset;
              while (rsp < rsend)
                *rsp++ |= *dsp++;
Index: src/derives.c
--- src/derives.c Sun, 18 Nov 2001 10:23:57 +0100 akim
+++ src/derives.c Sun, 18 Nov 2001 11:01:45 +0100 akim
@@ -40,17 +40,16 @@
   int i;
   short *sp;

-  fputs ("\n\n\nDERIVES\n\n", stderr);
+  fputs ("DERIVES\n", stderr);

   for (i = ntokens; i < nsyms; i++)
     {
-      fprintf (stderr, "%s derives", tags[i]);
+      fprintf (stderr, "\t%s derives\n", tags[i]);
       for (sp = derives[i]; *sp > 0; sp++)
-       fprintf (stderr, "  %d", *sp);
-      putc ('\n', stderr);
+       fprintf (stderr, "\t\t%d (%s)\n", *sp, tags[*sp]);
     }

-  putc ('\n', stderr);
+  fputs ("\n\n", stderr);
 }


Index: src/nullable.c
--- src/nullable.c Sun, 18 Nov 2001 10:23:57 +0100 akim
+++ src/nullable.c Sun, 18 Nov 2001 10:56:41 +0100 akim
@@ -49,7 +49,7 @@
   short *r1;

   if (trace_flag)
-    fprintf (stderr, "Entering set_nullable");
+    fprintf (stderr, "Entering set_nullable\n");

   nullable = XCALLOC (char, nvars) - ntokens;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]