+ /* Compute the width of the lookaheads column. */
+ for (i = 0; i < errp->num; ++i)
+ if (errp->symbols[i])
+ max_length (&width, errp->symbols[i]->tag);
+
+ /* Nothing to report. */
+ if (!width)
+ return;
+
+ fputc ('\n', out);
+ width += 2;
+
+ /* Report lookaheads and errors. */
+ for (i = 0; i < errp->num; ++i)
+ if (errp->symbols[i])
+ {
+ const char *tag = errp->symbols[i]->tag;
+ int j;
+ fprintf (out, " %s", tag);
+ for (j = width - strlen (tag); j > 0; --j)
+ fputc (' ', out);
+ fputs (_("error (nonassociative)\n"), out);
+ }
+}
+
+
+/*----------------------------------------------------------.
+| Return the default rule of this STATE if it has one, NULL |
+| otherwise. |
+`----------------------------------------------------------*/
+
+static rule_t *
+state_default_rule (state_t *state)
+{
+ reductions_t *redp = state->reductions;
+ rule_t *default_rule = NULL;
+ int cmax = 0;
+ int i;
+
+ /* No need for a lookahead. */
+ if (state->consistent)
+ return redp->rules[0];
+
+ /* 1. Each reduction is possibly masked by the lookaheads on which
+ we shift (S/R conflicts)... */
+ bitset_zero (shiftset);
+ {
+ transitions_t *transitions = state->transitions;
+ FOR_EACH_SHIFT (transitions, i)
+ {
+ /* If this state has a shift for the error token, don't use a
+ default rule. */
+ if (TRANSITION_IS_ERROR (transitions, i))
+ return NULL;
+ bitset_set (shiftset, TRANSITION_SYMBOL (transitions, i));
+ }
+ }
+
+ /* 2. Each reduction is possibly masked by the lookaheads on which
+ we raise an error (due to %nonassoc). */
+ {
+ errs_t *errp = state->errs;
+ for (i = 0; i < errp->num; i++)
+ if (errp->symbols[i])
+ bitset_set (shiftset, errp->symbols[i]->number);
+ }
+
+ for (i = 0; i < redp->num; ++i)