X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/2a73b93df45e9cab008947d3f8290c0c7f4bf500..710ddc4f18039668a7672c8670eb3e010b59292a:/src/LR0.c diff --git a/src/LR0.c b/src/LR0.c index 4beca5be..5e8caef0 100644 --- a/src/LR0.c +++ b/src/LR0.c @@ -36,11 +36,9 @@ 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; - } } /*-------------------------------------------------------------------.