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;
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;
}
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
/* 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;
}
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;
/* 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;
}
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 ();
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 ();
/* 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);
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;
- }
}
/*-------------------------------------------------------------------.