mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-19 17:23:02 +00:00
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:
14
ChangeLog
14
ChangeLog
@@ -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.
|
||||||
|
|||||||
69
src/LR0.c
69
src/LR0.c
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
Reference in New Issue
Block a user