]> git.saurik.com Git - bison.git/blobdiff - src/LR0.c
* src/muscle_tab.c (muscle_init): Remove 'verbose' muscle initialization.
[bison.git] / src / LR0.c
index e3db49aa4562f30cd1dd756bb9805641ebd67bb5..06ee51f6d3940e8cae26c63132a902306d60ecd2 100644 (file)
--- a/src/LR0.c
+++ b/src/LR0.c
@@ -1,5 +1,5 @@
 /* Generate the nondeterministic finite state machine for bison,
-   Copyright 1984, 1986, 1989, 2000 Free Software Foundation, Inc.
+   Copyright 1984, 1986, 1989, 2000, 2001  Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -23,6 +23,8 @@
    The entry point is generate_states.  */
 
 #include "system.h"
+#include "getargs.h"
+#include "reader.h"
 #include "gram.h"
 #include "state.h"
 #include "complain.h"
@@ -48,7 +50,7 @@ static short *redset = NULL;
 static short *shiftset = NULL;
 
 static short **kernel_base = NULL;
-static short **kernel_end = NULL;
+static int *kernel_size = NULL;
 static short *kernel_items = NULL;
 
 /* hash table for states, to recognize equivalent ones.  */
@@ -60,8 +62,6 @@ static core **state_table = NULL;
 static void
 allocate_itemsets (void)
 {
-  short *itemp = NULL;
-  int symbol;
   int i;
   int count;
   short *symbol_count = NULL;
@@ -69,17 +69,12 @@ allocate_itemsets (void)
   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
@@ -99,7 +94,7 @@ allocate_itemsets (void)
     }
 
   shift_symbol = symbol_count;
-  kernel_end = XCALLOC (short *, nsyms);
+  kernel_size = XCALLOC (int, nsyms);
 }
 
 
@@ -121,7 +116,7 @@ free_storage (void)
   XFREE (redset);
   XFREE (shiftset);
   XFREE (kernel_base);
-  XFREE (kernel_end);
+  XFREE (kernel_size);
   XFREE (kernel_items);
   XFREE (state_table);
 }
@@ -137,8 +132,7 @@ free_storage (void)
 | shift_symbol is set to a vector of the symbols that can be      |
 | shifted.  For each symbol in the grammar, kernel_base[symbol]   |
 | points to a vector of item numbers activated if that symbol is  |
-| shifted, and kernel_end[symbol] points after the end of that    |
-| vector.                                                         |
+| shifted, and kernel_size[symbol] is their numbers.              |
 `----------------------------------------------------------------*/
 
 static void
@@ -146,38 +140,29 @@ new_itemsets (void)
 {
   int i;
   int shiftcount;
-  short *isp;
-  short *ksp;
-  int symbol;
 
-#if TRACE
-  fprintf (stderr, "Entering new_itemsets, state = %d\n",
-          this_state->number);
-#endif
+  if (trace_flag)
+    fprintf (stderr, "Entering new_itemsets, state = %d\n",
+            this_state->number);
 
   for (i = 0; i < nsyms; i++)
-    kernel_end[i] = NULL;
+    kernel_size[i] = 0;
 
   shiftcount = 0;
 
-  isp = itemset;
-
-  while (isp < itemsetend)
+  for (i = 0; i < itemsetsize; ++i)
     {
-      i = *isp++;
-      symbol = ritem[i];
+      int symbol = ritem[itemset[i]];
       if (symbol > 0)
        {
-         ksp = kernel_end[symbol];
-
-         if (!ksp)
+         if (!kernel_size[symbol])
            {
-             shift_symbol[shiftcount++] = symbol;
-             ksp = kernel_base[symbol];
+             shift_symbol[shiftcount] = symbol;
+             shiftcount++;
            }
 
-         *ksp++ = i + 1;
-         kernel_end[symbol] = ksp;
+         kernel_base[symbol][kernel_size[symbol]] = itemset[i] + 1;
+         kernel_size[symbol]++;
        }
     }
 
@@ -194,36 +179,24 @@ new_itemsets (void)
 static core *
 new_state (int symbol)
 {
-  int n;
   core *p;
-  short *isp1;
-  short *isp2;
-  short *iend;
 
-#if TRACE
-  fprintf (stderr, "Entering new_state, symbol = %d, state = %d\n",
-          symbol, nstates);
-#endif
+  if (trace_flag)
+    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);
 
-  isp1 = kernel_base[symbol];
-  iend = kernel_end[symbol];
-  n = iend - isp1;
-
-  p = CORE_ALLOC (n);
+  p = CORE_ALLOC (kernel_size[symbol]);
   p->accessing_symbol = symbol;
   p->number = nstates;
-  p->nitems = n;
+  p->nitems = kernel_size[symbol];
 
-  isp2 = p->items;
-  while (isp1 < iend)
-    *isp2++ = *isp1++;
+  shortcpy (p->items, kernel_base[symbol], kernel_size[symbol]);
 
   last_state->next = p;
   last_state = p;
-
   nstates++;
 
   return p;
@@ -233,54 +206,39 @@ new_state (int symbol)
 /*--------------------------------------------------------------.
 | Find the state number for the state we would get to (from the |
 | current state) by shifting symbol.  Create a new state if no  |
-| equivalent one exists already.  Used by append_states.         |
+| equivalent one exists already.  Used by append_states.        |
 `--------------------------------------------------------------*/
 
 static int
 get_state (int symbol)
 {
   int key;
-  short *isp1;
-  short *isp2;
-  short *iend;
+  int i;
   core *sp;
-  int found;
-
-  int n;
 
-#if TRACE
-  fprintf (stderr, "Entering get_state, symbol = %d\n", symbol);
-#endif
+  if (trace_flag)
+    fprintf (stderr, "Entering get_state, state = %d, symbol = %d (%s)\n",
+            this_state->number, symbol, tags[symbol]);
 
-  isp1 = kernel_base[symbol];
-  iend = kernel_end[symbol];
-  n = iend - isp1;
-
-  /* add up the target state's active item numbers to get a hash key */
+  /* Add up the target state's active item numbers to get a hash key.
+     */
   key = 0;
-  while (isp1 < iend)
-    key += *isp1++;
-
+  for (i = 0; i < kernel_size[symbol]; ++i)
+    key += kernel_base[symbol][i];
   key = key % STATE_TABLE_SIZE;
-
   sp = state_table[key];
 
   if (sp)
     {
-      found = 0;
+      int found = 0;
       while (!found)
        {
-         if (sp->nitems == n)
+         if (sp->nitems == kernel_size[symbol])
            {
              found = 1;
-             isp1 = kernel_base[symbol];
-             isp2 = sp->items;
-
-             while (found && isp1 < iend)
-               {
-                 if (*isp1++ != *isp2++)
-                   found = 0;
-               }
+             for (i = 0; i < kernel_size[symbol]; ++i)
+               if (kernel_base[symbol][i] != sp->items[i])
+                 found = 0;
            }
 
          if (!found)
@@ -302,6 +260,9 @@ get_state (int symbol)
       state_table[key] = sp = new_state (symbol);
     }
 
+  if (trace_flag)
+    fprintf (stderr, "Exiting get_state => %d\n", sp->number);
+
   return sp->number;
 }
 
@@ -319,9 +280,9 @@ append_states (void)
   int j;
   int symbol;
 
-#if TRACE
-  fprintf (stderr, "Entering append_states\n");
-#endif
+  if (trace_flag)
+    fprintf (stderr, "Entering append_states, state = %d\n",
+            this_state->number);
 
   /* first sort shift_symbol into increasing order */
 
@@ -338,20 +299,14 @@ append_states (void)
     }
 
   for (i = 0; i < nshifts; i++)
-    {
-      symbol = shift_symbol[i];
-      shiftset[i] = get_state (symbol);
-    }
+    shiftset[i] = get_state (shift_symbol[i]);
 }
 
 
 static void
 new_states (void)
 {
-  core *p;
-
-  p = CORE_ALLOC (0);
-  first_state = last_state = this_state = p;
+  first_state = last_state = this_state = CORE_ALLOC (0);
   nstates = 1;
 }
 
@@ -359,33 +314,18 @@ new_states (void)
 static void
 save_shifts (void)
 {
-  shifts *p;
-  short *sp1;
-  short *sp2;
-  short *send;
-
-  p = SHIFTS_ALLOC (nshifts);
+  shifts *p = SHIFTS_ALLOC (nshifts);
 
   p->number = this_state->number;
   p->nshifts = nshifts;
 
-  sp1 = shiftset;
-  sp2 = p->shifts;
-  send = shiftset + nshifts;
-
-  while (sp1 < send)
-    *sp2++ = *sp1++;
+  shortcpy (p->shifts, shiftset, nshifts);
 
   if (last_shift)
-    {
-      last_shift->next = p;
-      last_shift = p;
-    }
+    last_shift->next = p;
   else
-    {
-      first_shift = p;
-      last_shift = p;
-    }
+    first_shift = p;
+  last_shift = p;
 }
 
 
@@ -602,21 +542,15 @@ augment_automaton (void)
 static void
 save_reductions (void)
 {
-  short *isp;
-  short *rp1;
-  short *rp2;
-  int item;
   int count;
-  reductions *p;
-
-  short *rend;
+  int i;
 
   /* Find and count the active items that represent ends of rules. */
 
   count = 0;
-  for (isp = itemset; isp < itemsetend; isp++)
+  for (i = 0; i < itemsetsize; ++i)
     {
-      item = ritem[*isp];
+      int item = ritem[itemset[i]];
       if (item < 0)
        redset[count++] = -item;
     }
@@ -625,28 +559,18 @@ save_reductions (void)
 
   if (count)
     {
-      p = REDUCTIONS_ALLOC (count);
+      reductions *p = REDUCTIONS_ALLOC (count);
 
       p->number = this_state->number;
       p->nreds = count;
 
-      rp1 = redset;
-      rp2 = p->rules;
-      rend = rp1 + count;
-
-      for (/* nothing */; rp1 < rend; ++rp1, ++rp2)
-       *rp2 = *rp1;
+      shortcpy (p->rules, redset, count);
 
       if (last_reduction)
-       {
-         last_reduction->next = p;
-         last_reduction = p;
-       }
+       last_reduction->next = p;
       else
-       {
-         first_reduction = p;
-         last_reduction = p;
-       }
+       first_reduction = p;
+      last_reduction = p;
     }
 }