]> git.saurik.com Git - bison.git/blobdiff - src/LR0.c
* src/bison.simple: Remove #line just before %%epilogue. It
[bison.git] / src / LR0.c
index 4beca5bef9c1bac16eb75685e771c726169bb0b4..5e8caef046bd4bf12751459bd53534b7d4c95a7c 100644 (file)
--- a/src/LR0.c
+++ b/src/LR0.c
 int nstates;
 int final_state;
 static state_t *first_state = NULL;
-static shifts *first_shift = NULL;
 
 static state_t *this_state = NULL;
 static state_t *last_state = NULL;
-static shifts *last_shift = NULL;
 
 static int nshifts;
 static short *shift_symbol = NULL;
@@ -318,16 +316,8 @@ static void
 save_shifts (void)
 {
   shifts *p = shifts_new (nshifts);
-
-  p->number = this_state->number;
   shortcpy (p->shifts, shiftset, nshifts);
   this_state->shifts = p;
-
-  if (last_shift)
-    last_shift->next = p;
-  else
-    first_shift = p;
-  last_shift = p;
 }
 
 
@@ -347,7 +337,7 @@ insert_start_shifting_state (void)
   shifts *sp;
 
   statep = STATE_ALLOC (0);
-  statep->number = nstates;
+  statep->number = nstates++;
 
   /* The distinctive feature of this state from the
      eof_shifting_state, is that it is labeled as post-start-symbol
@@ -362,11 +352,7 @@ insert_start_shifting_state (void)
   /* Make a shift from this state to (what will be) the final state.  */
   sp = shifts_new (1);
   statep->shifts = sp;
-  sp->number = nstates++;
   sp->shifts[0] = nstates;
-
-  last_shift->next = sp;
-  last_shift = sp;
 }
 
 
@@ -386,7 +372,7 @@ insert_eof_shifting_state (void)
      next-to-final state.
      The symbol for that shift is 0 (end-of-file).  */
   statep = STATE_ALLOC (0);
-  statep->number = nstates;
+  statep->number = nstates++;
 
   last_state->next = statep;
   last_state = statep;
@@ -394,11 +380,7 @@ insert_eof_shifting_state (void)
   /* Make the shift from the final state to the termination state.  */
   sp = shifts_new (1);
   statep->shifts = sp;
-  sp->number = nstates++;
   sp->shifts[0] = nstates;
-
-  last_shift->next = sp;
-  last_shift = sp;
 }
 
 
@@ -446,10 +428,6 @@ augment_automaton (void)
       first_state->shifts = sp;
       sp->shifts[0] = nstates;
 
-      /* Initialize the chain of shifts with sp.  */
-      first_shift = sp;
-      last_shift = sp;
-
       /* Create the next-to-final state, with shift to
          what will be the final state.  */
       insert_start_shifting_state ();
@@ -473,29 +451,15 @@ augment_automaton (void)
             the final state.  */
          int i;
 
-         /* Find the shift that leads to this STATEP. */
-         shifts *sp = first_state->shifts;
-         shifts *sp1 = NULL;
-         shifts *sp2 = NULL;
-         while (sp->number < statep->number)
-           {
-             sp1 = sp;
-             sp = sp->next;
-           }
+         /* Find the shift of the inital state that leads to STATEP.  */
+         shifts *sp = statep->shifts;
 
-         sp2 = shifts_new (sp->nshifts + 1);
-         sp2->number = statep->number;
-         statep->shifts = sp2;
-         sp2->shifts[0] = nstates;
+         shifts *sp1 = shifts_new (sp->nshifts + 1);
+         statep->shifts = sp1;
+         sp1->shifts[0] = nstates;
          for (i = sp->nshifts; i > 0; i--)
-           sp2->shifts[i] = sp->shifts[i - 1];
-
-         /* Patch sp2 into the chain of shifts in place of sp,
-            following sp1.  */
-         sp2->next = sp->next;
-         sp1->next = sp2;
-         if (sp == last_shift)
-           last_shift = sp2;
+           sp1->shifts[i] = sp->shifts[i - 1];
+
          XFREE (sp);
 
          insert_eof_shifting_state ();
@@ -505,31 +469,23 @@ augment_automaton (void)
          /* There is no state for `start: start . ...'. */
          int i, k;
          shifts *sp = first_state->shifts;
-         shifts *sp2 = NULL;
+         shifts *sp1 = NULL;
 
-         /* There is no next-to-final state as yet.  */
-         /* Add one more shift in first_shift,
-            going to the next-to-final state (yet to be made).  */
-         sp2 = shifts_new (sp->nshifts + 1);
-         first_state->shifts = sp2;
+         /* Add one more shift to the initial state, going to the
+            next-to-final state (yet to be made).  */
+         sp1 = shifts_new (sp->nshifts + 1);
+         first_state->shifts = sp1;
          /* Stick this shift into the vector at the proper place.  */
          statep = first_state->next;
          for (k = 0, i = 0; i < sp->nshifts; k++, i++)
            {
              if (statep->accessing_symbol > start_symbol && i == k)
-               sp2->shifts[k++] = nstates;
-             sp2->shifts[k] = sp->shifts[i];
+               sp1->shifts[k++] = nstates;
+             sp1->shifts[k] = sp->shifts[i];
              statep = statep->next;
            }
          if (i == k)
-           sp2->shifts[k++] = nstates;
-
-         /* Patch sp2 into the chain of shifts
-            in place of sp, at the beginning.  */
-         sp2->next = sp->next;
-         first_shift = sp2;
-         if (last_shift == sp)
-           last_shift = sp2;
+           sp1->shifts[k++] = nstates;
 
          XFREE (sp);
 
@@ -604,39 +560,6 @@ set_state_table (void)
       if (!state_table[i]->shifts)
        state_table[i]->shifts = shifts_new (0);
   }
-
-  /* Initializing the lookaheads members.  Please note that it must be
-     performed after having set some of the other members which are
-     used below.  Change with extreme caution.  */
-  {
-    int i;
-    int count = 0;
-    for (i = 0; i < nstates; i++)
-      {
-       int k;
-       reductions *rp = state_table[i]->reductions;
-       shifts *sp = state_table[i]->shifts;
-
-       state_table[i]->lookaheads = count;
-
-       if (rp
-           && (rp->nreds > 1 || (sp->nshifts && SHIFT_IS_SHIFT (sp, 0))))
-         count += rp->nreds;
-       else
-         state_table[i]->consistent = 1;
-
-       for (k = 0; k < sp->nshifts; k++)
-         if (SHIFT_IS_ERROR (sp, k))
-           {
-             state_table[i]->consistent = 0;
-             break;
-           }
-      }
-
-    /* Seems to be needed by conflicts.c. */
-    state_table[nstates] = STATE_ALLOC (0);
-    state_table[nstates]->lookaheads = count;
-  }
 }
 
 /*-------------------------------------------------------------------.