break;
for (k = 0; k < size; ++k)
- F (i)[k] = F (j)[k];
+ F (j)[k] = F (i)[k];
}
}
short *np;
reductions *rp;
- size_t nLA = state_table[nstates]->lookaheads;
+ size_t nLA = state_table[nstates]->lookaheadsp;
if (!nLA)
nLA = 1;
int found;
shorts *sp;
- i = state_table[stateno]->lookaheads;
- k = state_table[stateno + 1]->lookaheads;
+ i = state_table[stateno]->lookaheadsp;
+ k = state_table[stateno + 1]->lookaheadsp;
found = 0;
while (!found && i < k)
{
int i;
shorts *sp;
- for (i = 0; i < state_table[nstates]->lookaheads; i++)
+ for (i = 0; i < state_table[nstates]->lookaheadsp; i++)
for (sp = lookback[i]; sp; sp = sp->next)
{
int size = LA (i + 1) - LA (i);
}
/* Free LOOKBACK. */
- for (i = 0; i < state_table[nstates]->lookaheads; i++)
+ for (i = 0; i < state_table[nstates]->lookaheadsp; i++)
LIST_FREE (shorts, lookback[i]);
XFREE (lookback);
}
+/*--------------------------------------.
+| Initializing the lookaheads members. |
+`--------------------------------------*/
+
+static void
+initialize_lookaheads (void)
+{
+ int i;
+ int count = 0;
+ for (i = 0; i < nstates; i++)
+ {
+ int k;
+ int nlookaheads = 0;
+ reductions *rp = state_table[i]->reductions;
+ shifts *sp = state_table[i]->shifts;
+
+ if (rp
+ && (rp->nreds > 1 || (sp->nshifts && SHIFT_IS_SHIFT (sp, 0))))
+ nlookaheads += rp->nreds;
+ else
+ state_table[i]->consistent = 1;
+
+ for (k = 0; k < sp->nshifts; k++)
+ if (SHIFT_IS_ERROR (sp, k))
+ {
+ state_table[i]->consistent = 0;
+ break;
+ }
+
+ state_table[i]->nlookaheads = nlookaheads;
+ state_table[i]->lookaheadsp = count;
+ count += nlookaheads;
+ }
+
+ /* Seems to be needed by conflicts.c. */
+ state_table[nstates] = STATE_ALLOC (0);
+ state_table[nstates]->lookaheadsp = count;
+}
+
void
lalr (void)
{
tokensetsize = WORDSIZE (ntokens);
+ initialize_lookaheads ();
initialize_LA ();
set_goto_map ();
initialize_F ();