- state_number_t i;
- nLA = 0;
-
- /* Count */
- for (i = 0; i < nstates; i++)
- {
- int k;
- int nlookaheads = 0;
- reductions_t *rp = states[i]->reductions;
- transitions_t *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->num && TRANSITION_IS_SHIFT (sp, 0)))
- nlookaheads += rp->nreds;
- else
- states[i]->consistent = 1;
-
- for (k = 0; k < sp->num; k++)
- if (TRANSITION_IS_ERROR (sp, k))
- {
- states[i]->consistent = 0;
- break;
- }
-
- states[i]->nlookaheads = nlookaheads;
- nLA += nlookaheads;
- }
+ int n_lookahead_tokens = 0;
+ reductions *rp = s->reductions;
+ transitions *sp = s->transitions;
+
+ /* Transitions are only disabled during conflict resolution, and that
+ hasn't happened yet, so there should be no need to check that
+ transition 0 hasn't been disabled before checking if it is a shift.
+ However, this check was performed at one time, so we leave it as an
+ aver. */
+ aver (sp->num == 0 || !TRANSITION_IS_DISABLED (sp, 0));
+
+ /* 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'. However, do not treat a state with any reductions as
+ consistent unless it is the accepting state (because there is never
+ a lookahead token that makes sense there, and so no lookahead token
+ should be read) if the user has otherwise disabled default
+ reductions. */
+ if (rp->num > 1
+ || (rp->num == 1 && sp->num && TRANSITION_IS_SHIFT (sp, 0))
+ || (rp->num == 1 && rp->rules[0]->number != 0
+ && default_reduction_only_for_accept))
+ n_lookahead_tokens += rp->num;
+ else
+ s->consistent = 1;
+
+ return n_lookahead_tokens;