+/*-------------------------------------------------------------.
+| Count the number of lookaheads required for each state |
+| (NLOOKAHEADS member). Compute the total number of LA, NLA. |
+`-------------------------------------------------------------*/
+
+static void
+states_lookaheads_count (void)
+{
+ size_t i;
+ nLA = 0;
+
+ /* Count */
+ for (i = 0; i < nstates; i++)
+ {
+ int k;
+ int nlookaheads = 0;
+ reductions *rp = states[i]->reductions;
+ shifts *sp = states[i]->shifts;
+
+ /* We need a lookahead either to distinguish different
+ reductions (i.e., there are two or more), or to distinguish a
+ reduction from a shift. Otherwise, it is straightforward,
+ and the state is `consistent'. */
+ if (rp->nreds > 1
+ || (rp->nreds == 1 && sp->nshifts && SHIFT_IS_SHIFT (sp, 0)))
+ nlookaheads += rp->nreds;
+ else
+ states[i]->consistent = 1;
+
+ for (k = 0; k < sp->nshifts; k++)
+ if (SHIFT_IS_ERROR (sp, k))
+ {
+ states[i]->consistent = 0;
+ break;
+ }
+
+ states[i]->nlookaheads = nlookaheads;
+ nLA += nlookaheads;
+ }
+}
+
+
+/*--------------------------------------.
+| Initializing the lookaheads members. |
+`--------------------------------------*/
+
+static void
+states_lookaheads_initialize (void)
+{
+ size_t i;
+ bitsetv pLA = LA;
+ rule_t **pLArule = LArule;
+
+ /* Initialize the members LOOKAHEADS and LOOKAHEADS_RULE for each
+ state. */
+ for (i = 0; i < nstates; i++)
+ {
+ states[i]->lookaheads = pLA;
+ states[i]->lookaheads_rule = pLArule;
+ pLA += states[i]->nlookaheads;
+ pLArule += states[i]->nlookaheads;
+ }
+}
+
+
+/*---------------------------------------.
+| Output the lookaheads for each state. |
+`---------------------------------------*/
+
+static void
+lookaheads_print (FILE *out)
+{
+ size_t i;
+ int j, k;
+ fprintf (out, "Lookaheads: BEGIN\n");
+ for (i = 0; i < nstates; ++i)
+ {
+ fprintf (out, "State %d: %d lookaheads\n",
+ i, states[i]->nlookaheads);
+
+ for (j = 0; j < states[i]->nlookaheads; ++j)
+ for (k = 0; k < ntokens; ++k)
+ if (bitset_test (states[i]->lookaheads[j], k))
+ fprintf (out, " on %d (%s) -> rule %d\n",
+ k, symbol_tag_get (symbols[k]),
+ states[i]->lookaheads_rule[j]->number - 1);
+ }
+ fprintf (out, "Lookaheads: END\n");
+}
+