From 74392f6a54a667ced35be695c0ed24b0803e40b6 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 10 Dec 2001 09:09:14 +0000 Subject: [PATCH] * 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. --- ChangeLog | 8 ++++++++ src/LR0.c | 19 ++++++++++++------- tests/regression.at | 6 ------ 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index a29c27e3..bcb0024a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2001-12-10 Akim Demaille + + * 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 * src/LR0.c (augment_automaton): Now that all states have shifts, diff --git a/src/LR0.c b/src/LR0.c index 9de75782..d21a946f 100644 --- a/src/LR0.c +++ b/src/LR0.c @@ -457,18 +457,22 @@ augment_automaton (void) else { state_t *statep = first_state->next; - shifts *sp = first_shift; + shifts *sp = first_state->shifts; shifts *sp1 = NULL; /* 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 && statep->number < sp->nshifts) statep = statep->next; if (statep->accessing_symbol == start_symbol) { - /* We already have a next-to-final state. - Make sure it has a shift to what will be the final state. */ + /* We already have a next-to-final state, i.e., for `start: + start . ...'. Make sure it has a shift to what will be + the final state. */ while (sp && sp->number < statep->number) { sp1 = sp; @@ -506,9 +510,11 @@ augment_automaton (void) if (sp == 0) last_shift = sp2; } + insert_eof_shifting_state (); } else { + /* There is no state for `start: start . ...'. */ int i, k; shifts *sp2; sp = first_shift; @@ -539,13 +545,12 @@ augment_automaton (void) XFREE (sp); - /* Create the next-to-final state, with shift to - what will be the final state. */ + /* Create the next-to-final state, with shift to what will + be the final state. Corresponds to `start: start . ...'. */ insert_start_shifting_state (); } } - insert_eof_shifting_state (); insert_accepting_state (); } diff --git a/tests/regression.at b/tests/regression.at index 70e3420b..d8788f88 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -382,12 +382,6 @@ state 6 state 7 - $ go to state 8 - - - -state 8 - $default accept -- 2.47.2