mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-20 17:53:02 +00:00
* 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:
@@ -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,
|
||||||
|
|||||||
19
src/LR0.c
19
src/LR0.c
@@ -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 ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -382,12 +382,6 @@ state 6
|
|||||||
|
|
||||||
state 7
|
state 7
|
||||||
|
|
||||||
$ go to state 8
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state 8
|
|
||||||
|
|
||||||
$default accept
|
$default accept
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user