/* Generate the nondeterministic finite state machine for bison,
- Copyright 1984, 1986, 1989, 2000, 2001 Free Software Foundation, Inc.
+ Copyright 1984, 1986, 1989, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
The entry point is generate_states. */
#include "system.h"
+#include "bitset.h"
#include "symtab.h"
#include "getargs.h"
#include "reader.h"
#include "lalr.h"
#include "reduce.h"
-int nstates;
+unsigned int nstates = 0;
/* Initialize the final state to -1, otherwise, it might be set to 0
by default, and since we don't compute the reductions of the final
state, we end up not computing the reductions of the initial state,
static void
allocate_itemsets (void)
{
- int i;
+ int i, r;
+ short *rhsp;
/* Count the number of occurrences of all the symbols in RITEMS.
Note that useless productions (hence useless nonterminals) are
int count = 0;
short *symbol_count = XCALLOC (short, nsyms + nuseless_nonterminals);
- for (i = 0; i < nritems; ++i)
- if (ritem[i] >= 0)
+ for (r = 1; r < nrules + 1; ++r)
+ for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
{
count++;
- symbol_count[ritem[i]]++;
+ symbol_count[*rhsp]++;
}
/* See comments before new_itemsets. All the vectors of items
shiftset = XCALLOC (short, nsyms);
redset = XCALLOC (short, nrules + 1);
state_hash = XCALLOC (state_t *, STATE_HASH_SIZE);
+ shift_symbol = XCALLOC (short, nsyms);
}
for (i = 0; i < nsyms; i++)
kernel_size[i] = 0;
- shift_symbol = XCALLOC (short, nsyms);
nshifts = 0;
for (i = 0; i < nitemset; ++i)
if (trace_flag)
fprintf (stderr, "Entering new_state, state = %d, symbol = %d (%s)\n",
- this_state->number, symbol, tags[symbol]);
+ nstates, symbol, symbols[symbol]->tag);
if (nstates >= MAXSHORT)
fatal (_("too many states (max %d)"), MAXSHORT);
shortcpy (p->items, kernel_base[symbol], kernel_size[symbol]);
- last_state->next = p;
+ /* If this is the eoftoken, and this is not the initial state, then
+ this is the final state. */
+ if (symbol == 0 && first_state)
+ final_state = p->number;
+
+ if (!first_state)
+ first_state = p;
+ if (last_state)
+ last_state->next = p;
last_state = p;
- nstates++;
- /* If this is the eoftoken, then this is the final state. */
- if (symbol == 0)
- final_state = p->number;
+ nstates++;
return p;
}
if (trace_flag)
fprintf (stderr, "Entering get_state, state = %d, symbol = %d (%s)\n",
- this_state->number, symbol, tags[symbol]);
+ this_state->number, symbol, symbols[symbol]->tag);
/* Add up the target state's active item numbers to get a hash key.
*/
static void
new_states (void)
{
- first_state = last_state = this_state = STATE_ALLOC (0);
- nstates = 1;
+ /* The 0 at the lhs is the index of the item of this initial rule. */
+ kernel_base[0][0] = 0;
+ kernel_size[0] = 1;
+ this_state = new_state (0);
}
}
\f
-/*--------------------.
-| Build STATE_TABLE. |
-`--------------------*/
+/*---------------.
+| Build STATES. |
+`---------------*/
static void
-set_state_table (void)
+set_states (void)
{
state_t *sp;
- state_table = XCALLOC (state_t *, nstates);
+ states = XCALLOC (state_t *, nstates);
for (sp = first_state; sp; sp = sp->next)
{
if (!sp->reductions)
sp->reductions = reductions_new (0);
- state_table[sp->number] = sp;
+ states[sp->number] = sp;
}
}
{
if (trace_flag)
fprintf (stderr, "Processing state %d (reached by %s)\n",
- this_state->number, tags[this_state->accessing_symbol]);
+ this_state->number,
+ symbols[this_state->accessing_symbol]->tag);
/* Set up ruleset and itemset for the transitions out of this
state. ruleset gets a 1 bit for each rule that could reduce
now. itemset gets a vector of all the items that could be
free_closure ();
free_storage ();
- /* Set up STATE_TABLE. */
- set_state_table ();
+ /* Set up STATES. */
+ set_states ();
}