Now that states have a complete set of members, the linked list of

shifts is useless: just fill directly the state's shifts member.
* src/state.h (shifts): Remove the `next' member.
* src/LR0.c (first_state, last_state): Remove.
Adjust the callers.
(augment_automaton): Don't look for the shifts that must be added
a shift on EOF: it is those of the state we looked for!  But now,
since shifts are attached, it is no longer needed to looking
merely by its id: its number.
This commit is contained in:
Akim Demaille
2001-12-10 09:09:49 +00:00
parent 2a73b93df4
commit 190c4f5f0a
3 changed files with 29 additions and 55 deletions

View File

@@ -1,3 +1,17 @@
2001-12-10 Akim Demaille <akim@epita.fr>
Now that states have a complete set of members, the linked list of
shifts is useless: just fill directly the state's shifts member.
* src/state.h (shifts): Remove the `next' member.
* src/LR0.c (first_state, last_state): Remove.
Adjust the callers.
(augment_automaton): Don't look for the shifts that must be added
a shift on EOF: it is those of the state we looked for! But now,
since shifts are attached, it is no longer needed to looking
merely by its id: its number.
2001-12-10 Akim Demaille <akim@epita.fr> 2001-12-10 Akim Demaille <akim@epita.fr>
* src/LR0.c (augment_automaton): Better variable locality. * src/LR0.c (augment_automaton): Better variable locality.

View File

@@ -36,11 +36,9 @@
int nstates; int nstates;
int final_state; int final_state;
static state_t *first_state = NULL; static state_t *first_state = NULL;
static shifts *first_shift = NULL;
static state_t *this_state = NULL; static state_t *this_state = NULL;
static state_t *last_state = NULL; static state_t *last_state = NULL;
static shifts *last_shift = NULL;
static int nshifts; static int nshifts;
static short *shift_symbol = NULL; static short *shift_symbol = NULL;
@@ -322,12 +320,6 @@ save_shifts (void)
p->number = this_state->number; p->number = this_state->number;
shortcpy (p->shifts, shiftset, nshifts); shortcpy (p->shifts, shiftset, nshifts);
this_state->shifts = p; this_state->shifts = p;
if (last_shift)
last_shift->next = p;
else
first_shift = p;
last_shift = p;
} }
@@ -364,9 +356,6 @@ insert_start_shifting_state (void)
statep->shifts = sp; statep->shifts = sp;
sp->number = nstates++; sp->number = nstates++;
sp->shifts[0] = nstates; sp->shifts[0] = nstates;
last_shift->next = sp;
last_shift = sp;
} }
@@ -396,9 +385,6 @@ insert_eof_shifting_state (void)
statep->shifts = sp; statep->shifts = sp;
sp->number = nstates++; sp->number = nstates++;
sp->shifts[0] = nstates; sp->shifts[0] = nstates;
last_shift->next = sp;
last_shift = sp;
} }
@@ -446,10 +432,6 @@ augment_automaton (void)
first_state->shifts = sp; first_state->shifts = sp;
sp->shifts[0] = nstates; 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 /* Create the next-to-final state, with shift to
what will be the final state. */ what will be the final state. */
insert_start_shifting_state (); insert_start_shifting_state ();
@@ -473,29 +455,16 @@ augment_automaton (void)
the final state. */ the final state. */
int i; int i;
/* Find the shift that leads to this STATEP. */ /* Find the shift of the inital state that leads to STATEP. */
shifts *sp = first_state->shifts; shifts *sp = statep->shifts;
shifts *sp1 = NULL;
shifts *sp2 = NULL;
while (sp->number < statep->number)
{
sp1 = sp;
sp = sp->next;
}
sp2 = shifts_new (sp->nshifts + 1); shifts *sp1 = shifts_new (sp->nshifts + 1);
sp2->number = statep->number; sp1->number = statep->number;
statep->shifts = sp2; statep->shifts = sp1;
sp2->shifts[0] = nstates; sp1->shifts[0] = nstates;
for (i = sp->nshifts; i > 0; i--) for (i = sp->nshifts; i > 0; i--)
sp2->shifts[i] = sp->shifts[i - 1]; sp1->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;
XFREE (sp); XFREE (sp);
insert_eof_shifting_state (); insert_eof_shifting_state ();
@@ -505,31 +474,23 @@ augment_automaton (void)
/* There is no state for `start: start . ...'. */ /* There is no state for `start: start . ...'. */
int i, k; int i, k;
shifts *sp = first_state->shifts; shifts *sp = first_state->shifts;
shifts *sp2 = NULL; shifts *sp1 = NULL;
/* There is no next-to-final state as yet. */ /* Add one more shift to the initial state, going to the
/* Add one more shift in first_shift, next-to-final state (yet to be made). */
going to the next-to-final state (yet to be made). */ sp1 = shifts_new (sp->nshifts + 1);
sp2 = shifts_new (sp->nshifts + 1); first_state->shifts = sp1;
first_state->shifts = sp2;
/* Stick this shift into the vector at the proper place. */ /* Stick this shift into the vector at the proper place. */
statep = first_state->next; statep = first_state->next;
for (k = 0, i = 0; i < sp->nshifts; k++, i++) for (k = 0, i = 0; i < sp->nshifts; k++, i++)
{ {
if (statep->accessing_symbol > start_symbol && i == k) if (statep->accessing_symbol > start_symbol && i == k)
sp2->shifts[k++] = nstates; sp1->shifts[k++] = nstates;
sp2->shifts[k] = sp->shifts[i]; sp1->shifts[k] = sp->shifts[i];
statep = statep->next; statep = statep->next;
} }
if (i == k) if (i == k)
sp2->shifts[k++] = nstates; sp1->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;
XFREE (sp); XFREE (sp);

View File

@@ -95,7 +95,6 @@
typedef struct shifts typedef struct shifts
{ {
struct shifts *next;
short number; short number;
short nshifts; short nshifts;
short shifts[1]; short shifts[1];