* src/LR0.c (augment_automaton): Call `insert_eof_shifting_state'

only when appropriate: when insert_start_shifting_state' is not
invoked.
* tests/regression.at (Rule Line Numbers): Adjust.
This commit is contained in:
Akim Demaille
2001-12-10 09:09:14 +00:00
parent 37c82725c8
commit 74392f6a54
3 changed files with 20 additions and 13 deletions

View File

@@ -1,3 +1,11 @@
2001-12-10 Akim Demaille <akim@epita.fr>
* src/LR0.c (augment_automaton): Call `insert_eof_shifting_state'
only when appropriate: when insert_start_shifting_state' is not
invoked.
* tests/regression.at (Rule Line Numbers): Adjust.
2001-12-10 Akim Demaille <akim@epita.fr> 2001-12-10 Akim Demaille <akim@epita.fr>
* src/LR0.c (augment_automaton): Now that all states have shifts, * src/LR0.c (augment_automaton): Now that all states have shifts,

View File

@@ -457,18 +457,22 @@ augment_automaton (void)
else else
{ {
state_t *statep = first_state->next; state_t *statep = first_state->next;
shifts *sp = first_shift; shifts *sp = first_state->shifts;
shifts *sp1 = NULL; shifts *sp1 = NULL;
/* The states reached by shifts from FIRST_STATE are numbered /* The states reached by shifts from FIRST_STATE are numbered
1..(SP->NSHIFTS). Look for one reached by START_SYMBOL. */ 1..(SP->NSHIFTS). Look for one reached by START_SYMBOL.
This is typical of `start: start ... ;': there is a state
with the item `start: start . ...'. We want to add a `shift
on EOF to eof-shifting state here. */
while (statep->accessing_symbol != start_symbol while (statep->accessing_symbol != start_symbol
&& statep->number < sp->nshifts) && statep->number < sp->nshifts)
statep = statep->next; statep = statep->next;
if (statep->accessing_symbol == start_symbol) if (statep->accessing_symbol == start_symbol)
{ {
/* We already have a next-to-final state. /* We already have a next-to-final state, i.e., for `start:
Make sure it has a shift to what will be the final state. */ start . ...'. Make sure it has a shift to what will be
the final state. */
while (sp && sp->number < statep->number) while (sp && sp->number < statep->number)
{ {
sp1 = sp; sp1 = sp;
@@ -506,9 +510,11 @@ augment_automaton (void)
if (sp == 0) if (sp == 0)
last_shift = sp2; last_shift = sp2;
} }
insert_eof_shifting_state ();
} }
else else
{ {
/* There is no state for `start: start . ...'. */
int i, k; int i, k;
shifts *sp2; shifts *sp2;
sp = first_shift; sp = first_shift;
@@ -539,13 +545,12 @@ augment_automaton (void)
XFREE (sp); XFREE (sp);
/* Create the next-to-final state, with shift to /* Create the next-to-final state, with shift to what will
what will be the final state. */ be the final state. Corresponds to `start: start . ...'. */
insert_start_shifting_state (); insert_start_shifting_state ();
} }
} }
insert_eof_shifting_state ();
insert_accepting_state (); insert_accepting_state ();
} }

View File

@@ -382,12 +382,6 @@ state 6
state 7 state 7
$ go to state 8
state 8
$default accept $default accept