-static int
-action_row (state_t *state)
-{
- int i;
- int default_rule = 0;
- reductions *redp = state->reductions;
- shifts *shiftp = state->shifts;
- errs *errp = state->errs;
- /* set nonzero to inhibit having any default reduction */
- int nodefault = 0;
-
- for (i = 0; i < ntokens; i++)
- actrow[i] = 0;
-
- if (redp->nreds >= 1)
- {
- int j;
- /* loop over all the rules available here which require
- lookahead */
- for (i = state->nlookaheads - 1; i >= 0; --i)
- /* and find each token which the rule finds acceptable
- to come next */
- for (j = 0; j < ntokens; j++)
- /* and record this rule as the rule to use if that
- token follows. */
- if (bitset_test (LA[state->lookaheadsp + i], j))
- actrow[j] = -LAruleno[state->lookaheadsp + i];
- }
-
- /* Now see which tokens are allowed for shifts in this state. For
- them, record the shift as the thing to do. So shift is preferred
- to reduce. */
- for (i = 0; i < shiftp->nshifts; i++)
- {
- int symbol;
- int shift_state = shiftp->shifts[i];
- if (!shift_state)
- continue;
-
- symbol = states[shift_state]->accessing_symbol;
-
- if (ISVAR (symbol))
- break;
-
- actrow[symbol] = shift_state;
-
- /* Do not use any default reduction if there is a shift for
- error */
- if (symbol == error_token_number)
- nodefault = 1;
- }
-
- /* See which tokens are an explicit error in this state (due to
- %nonassoc). For them, record MINSHORT as the action. */
- for (i = 0; i < errp->nerrs; i++)
- {
- int symbol = errp->errs[i];
- actrow[symbol] = MINSHORT;
- }
-
- /* Now find the most common reduction and make it the default action
- for this state. */
-
- if (redp->nreds >= 1 && !nodefault)
- {
- if (state->consistent)
- default_rule = redp->rules[0];
- else
- {
- int max = 0;
- for (i = 0; i < state->nlookaheads; i++)
- {
- int count = 0;
- int rule = -LAruleno[state->lookaheadsp + i];
- int j;
-
- for (j = 0; j < ntokens; j++)
- if (actrow[j] == rule)
- count++;
-
- if (count > max)
- {
- max = count;
- default_rule = rule;
- }
- }
-
- /* actions which match the default are replaced with zero,
- which means "use the default" */
-
- if (max > 0)
- {
- int j;
- for (j = 0; j < ntokens; j++)
- if (actrow[j] == default_rule)
- actrow[j] = 0;
-
- default_rule = -default_rule;
- }
- }
- }
-
- /* If have no default rule, the default is an error.
- So replace any action which says "error" with "use default". */
-
- if (default_rule == 0)
- for (i = 0; i < ntokens; i++)
- if (actrow[i] == MINSHORT)
- actrow[i] = 0;
-
- return default_rule;
-}
-
-
-static void
-save_row (int state)
-{
- int i;
- int count;
- short *sp;
- short *sp1;
- short *sp2;
-
- count = 0;
- for (i = 0; i < ntokens; i++)
- if (actrow[i] != 0)
- count++;
-
- if (count == 0)
- return;
-
- froms[state] = sp1 = sp = XCALLOC (short, count);
- tos[state] = sp2 = XCALLOC (short, count);
-
- for (i = 0; i < ntokens; i++)
- if (actrow[i] != 0)
- {
- *sp1++ = i;
- *sp2++ = actrow[i];
- }
-
- tally[state] = count;
- width[state] = sp1[-1] - sp[0] + 1;
-}
-
-
-/*------------------------------------------------------------------.
-| Figure out the actions for the specified state, indexed by |
-| lookahead token type. |
-| |
-| The YYDEFACT table is output now. The detailed info is saved for |
-| putting into YYTABLE later. |
-`------------------------------------------------------------------*/