]> git.saurik.com Git - bison.git/blobdiff - src/LR0.c
* src/conflicts.c (set_conflicts): Use arrays instead of pointers
[bison.git] / src / LR0.c
index 133a8218c2fcd046cebff0135a7cb08ee652c947..b67bd78b0b948819ffbdeff7bec0b4aea67ed5d5 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"
@@ -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
@@ -146,36 +141,31 @@ new_itemsets (void)
 {
   int i;
   int shiftcount;
-  short *isp;
-  short *ksp;
-  int symbol;
 
-#if TRACE
-  fprintf (stderr, "Entering new_itemsets\n");
-#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;
 
   shiftcount = 0;
 
-  isp = itemset;
-
-  while (isp < itemsetend)
+  for (i = 0; i < itemsetend - itemset; ++i)
     {
-      i = *isp++;
-      symbol = ritem[i];
+      int symbol = ritem[itemset[i]];
       if (symbol > 0)
        {
-         ksp = kernel_end[symbol];
+         short *ksp = kernel_end[symbol];
 
          if (!ksp)
            {
-             shift_symbol[shiftcount++] = symbol;
+             shift_symbol[shiftcount] = symbol;
              ksp = kernel_base[symbol];
+             shiftcount++;
            }
 
-         *ksp++ = i + 1;
+         *ksp++ = itemset[i] + 1;
          kernel_end[symbol] = ksp;
        }
     }
@@ -195,34 +185,25 @@ new_state (int symbol)
 {
   int n;
   core *p;
-  short *isp1;
-  short *isp2;
-  short *iend;
 
-#if TRACE
-  fprintf (stderr, "Entering new_state, symbol = %d\n", symbol);
-#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;
+  n = kernel_end[symbol] - kernel_base[symbol];
 
-  p =
-    (core *) xcalloc ((unsigned) (sizeof (core) + (n - 1) * sizeof (short)), 1);
+  p = CORE_ALLOC (n);
   p->accessing_symbol = symbol;
   p->number = nstates;
   p->nitems = n;
 
-  isp2 = p->items;
-  while (isp1 < iend)
-    *isp2++ = *isp1++;
+  shortcpy (p->items, kernel_base[symbol], n);
 
   last_state->next = p;
   last_state = p;
-
   nstates++;
 
   return p;
@@ -232,54 +213,43 @@ 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
+  int n = kernel_end[symbol] - kernel_base[symbol];
 
-  isp1 = kernel_base[symbol];
-  iend = kernel_end[symbol];
-  n = iend - isp1;
+  if (trace_flag)
+    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 */
+  /* 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 < n; ++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)
            {
+             int i;
              found = 1;
-             isp1 = kernel_base[symbol];
-             isp2 = sp->items;
-
-             while (found && isp1 < iend)
-               {
-                 if (*isp1++ != *isp2++)
-                   found = 0;
-               }
+             for (i = 0; i < n; ++i)
+               if (kernel_base[symbol][i] != sp->items[i])
+                 found = 0;
            }
 
          if (!found)
@@ -301,6 +271,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;
 }
 
@@ -318,9 +291,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 */
 
@@ -337,20 +310,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 *) xcalloc ((unsigned) (sizeof (core) - sizeof (short)), 1);
-  first_state = last_state = this_state = p;
+  first_state = last_state = this_state = CORE_ALLOC (0);
   nstates = 1;
 }
 
@@ -358,34 +325,18 @@ new_states (void)
 static void
 save_shifts (void)
 {
-  shifts *p;
-  short *sp1;
-  short *sp2;
-  short *send;
-
-  p = (shifts *) xcalloc ((unsigned) (sizeof (shifts) +
-                                     (nshifts - 1) * sizeof (short)), 1);
+  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;
 }
 
 
@@ -400,7 +351,7 @@ insert_start_shift (void)
   core *statep;
   shifts *sp;
 
-  statep = (core *) xcalloc ((unsigned) (sizeof (core) - sizeof (short)), 1);
+  statep = CORE_ALLOC (0);
   statep->number = nstates;
   statep->accessing_symbol = start_symbol;
 
@@ -408,7 +359,7 @@ insert_start_shift (void)
   last_state = statep;
 
   /* Make a shift from this state to (what will be) the final state.  */
-  sp = XCALLOC (shifts, 1);
+  sp = SHIFTS_ALLOC (1);
   sp->number = nstates++;
   sp->nshifts = 1;
   sp->shifts[0] = nstates;
@@ -465,10 +416,7 @@ augment_automaton (void)
 
              if (sp && sp->number == k)
                {
-                 sp2 = (shifts *) xcalloc ((unsigned) (sizeof (shifts)
-                                                       +
-                                                       sp->nshifts *
-                                                       sizeof (short)), 1);
+                 sp2 = SHIFTS_ALLOC (sp->nshifts + 1);
                  sp2->number = k;
                  sp2->nshifts = sp->nshifts + 1;
                  sp2->shifts[0] = nstates;
@@ -485,7 +433,7 @@ augment_automaton (void)
                }
              else
                {
-                 sp2 = XCALLOC (shifts, 1);
+                 sp2 = SHIFTS_ALLOC (1);
                  sp2->number = k;
                  sp2->nshifts = 1;
                  sp2->shifts[0] = nstates;
@@ -504,8 +452,7 @@ augment_automaton (void)
                 going to the next-to-final state (yet to be made).  */
              sp = first_shift;
 
-             sp2 = (shifts *) xcalloc (sizeof (shifts)
-                                       + sp->nshifts * sizeof (short), 1);
+             sp2 = SHIFTS_ALLOC (sp->nshifts + 1);
              sp2->nshifts = sp->nshifts + 1;
 
              /* Stick this shift into the vector at the proper place.  */
@@ -538,7 +485,7 @@ augment_automaton (void)
        {
          /* The initial state didn't even have any shifts.
             Give it one shift, to the next-to-final state.  */
-         sp = XCALLOC (shifts, 1);
+         sp = SHIFTS_ALLOC (1);
          sp->nshifts = 1;
          sp->shifts[0] = nstates;
 
@@ -556,7 +503,7 @@ augment_automaton (void)
       /* There are no shifts for any state.
          Make one shift, from the initial state to the next-to-final state.  */
 
-      sp = XCALLOC (shifts, 1);
+      sp = SHIFTS_ALLOC (1);
       sp->nshifts = 1;
       sp->shifts[0] = nstates;
 
@@ -572,13 +519,13 @@ augment_automaton (void)
   /* Make the final state--the one that follows a shift from the
      next-to-final state.
      The symbol for that shift is 0 (end-of-file).  */
-  statep = (core *) xcalloc ((unsigned) (sizeof (core) - sizeof (short)), 1);
+  statep = CORE_ALLOC (0);
   statep->number = nstates;
   last_state->next = statep;
   last_state = statep;
 
   /* Make the shift from the final state to the termination state.  */
-  sp = XCALLOC (shifts, 1);
+  sp = SHIFTS_ALLOC (1);
   sp->number = nstates++;
   sp->nshifts = 1;
   sp->shifts[0] = nstates;
@@ -590,7 +537,7 @@ augment_automaton (void)
   final_state = nstates;
 
   /* Make the termination state.  */
-  statep = (core *) xcalloc ((unsigned) (sizeof (core) - sizeof (short)), 1);
+  statep = CORE_ALLOC (0);
   statep->number = nstates++;
   last_state->next = statep;
   last_state = statep;
@@ -607,8 +554,6 @@ static void
 save_reductions (void)
 {
   short *isp;
-  short *rp1;
-  short *rp2;
   int item;
   int count;
   reductions *p;
@@ -629,29 +574,18 @@ save_reductions (void)
 
   if (count)
     {
-      p = (reductions *) xcalloc ((unsigned) (sizeof (reductions) +
-                                             (count - 1) * sizeof (short)), 1);
+      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;
     }
 }