+/*-------------------------------------------------------------.
+| Return the default rule of S if it has one, NULL otherwise. |
+`-------------------------------------------------------------*/
+
+static rule *
+state_default_rule (state *s)
+{
+ reductions *reds = s->reductions;
+ rule *default_rule = NULL;
+ int cmax = 0;
+ int i;
+
+ /* No need for a look-ahead. */
+ if (s->consistent)
+ return reds->rules[0];
+
+ /* 1. Each reduction is possibly masked by the look-ahead tokens on which
+ we shift (S/R conflicts)... */
+ bitset_zero (shift_set);
+ {
+ transitions *trans = s->transitions;
+ FOR_EACH_SHIFT (trans, i)
+ {
+ /* If this state has a shift for the error token, don't use a
+ default rule. */
+ if (TRANSITION_IS_ERROR (trans, i))
+ return NULL;
+ bitset_set (shift_set, TRANSITION_SYMBOL (trans, i));
+ }
+ }
+
+ /* 2. Each reduction is possibly masked by the look-ahead tokens on which
+ we raise an error (due to %nonassoc). */
+ {
+ errs *errp = s->errs;
+ for (i = 0; i < errp->num; i++)
+ if (errp->symbols[i])
+ bitset_set (shift_set, errp->symbols[i]->number);
+ }
+
+ for (i = 0; i < reds->num; ++i)
+ {
+ int count = 0;