GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_table, short)
GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table, symbol_number_t)
GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table, item_number_t)
+GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number_t)
/*-----------------------------------------------------------------.
static void
prepare_rules (void)
{
- int r;
+ rule_number_t r;
unsigned int i = 0;
item_number_t *rhs = XMALLOC (item_number_t, nritems);
unsigned int *prhs = XMALLOC (unsigned int, nrules + 1);
for (r = 1; r < nrules + 1; ++r)
{
- item_number_t *rhsp;
+ item_number_t *rhsp = NULL;
/* Index of rule R in RHS. */
prhs[r] = i;
/* RHS of the rule R. */
static void
prepare_states (void)
{
- size_t i;
+ state_number_t i;
symbol_number_t *values =
(symbol_number_t *) alloca (sizeof (symbol_number_t) * nstates);
for (i = 0; i < nstates; ++i)
values[i] = states[i]->accessing_symbol;
muscle_insert_symbol_number_table ("stos", values,
- 0, 1, nstates);
+ 0, 1, nstates);
}
action_row (state_t *state)
{
int i;
- int default_rule = 0;
- reductions *redp = state->reductions;
- shifts *shiftp = state->shifts;
- errs *errp = state->errs;
+ rule_number_t default_rule = 0;
+ reductions_t *redp = state->reductions;
+ shifts_t *shiftp = state->shifts;
+ errs_t *errp = state->errs;
/* set nonzero to inhibit having any default reduction */
int nodefault = 0;
int conflicted = 0;
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++)
+ BITSET_EXECUTE (state->lookaheads[i], 0, j,
+ {
/* and record this rule as the rule to use if that
token follows. */
- if (bitset_test (state->lookaheads[i], j))
- {
- if (actrow[j] != 0)
- conflicted = conflrow[j] = 1;
- actrow[j] = -state->lookaheads_rule[i]->number;
- }
+ if (actrow[j] != 0)
+ conflicted = conflrow[j] = 1;
+ actrow[j] = -state->lookaheads_rule[i]->number;
+ });
}
/* 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++)
- {
- symbol_number_t symbol;
- int shift_state = shiftp->shifts[i];
- if (!shift_state)
- continue;
-
- symbol = states[shift_state]->accessing_symbol;
-
- if (ISVAR (symbol))
- break;
+ for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
+ if (!SHIFT_IS_DISABLED (shiftp, i))
+ {
+ symbol_number_t symbol = SHIFT_SYMBOL (shiftp, i);
+ state_number_t shift_state = shiftp->shifts[i];
- if (actrow[symbol] != 0)
- conflicted = conflrow[symbol] = 1;
- actrow[symbol] = shift_state;
+ if (actrow[symbol] != 0)
+ conflicted = conflrow[symbol] = 1;
+ actrow[symbol] = state_number_as_int (shift_state);
- /* Do not use any default reduction if there is a shift for
- error */
- if (symbol == errtoken->number)
- nodefault = 1;
- }
+ /* Do not use any default reduction if there is a shift for
+ error */
+ if (symbol == errtoken->number)
+ nodefault = 1;
+ }
/* See which tokens are an explicit error in this state (due to
%nonassoc). For them, record SHRT_MIN as the action. */
for (i = 0; i < state->nlookaheads; i++)
{
int count = 0;
- int rule = -state->lookaheads_rule[i]->number;
- int j;
+ rule_number_t rule = -state->lookaheads_rule[i]->number;
+ symbol_number_t j;
for (j = 0; j < ntokens; j++)
if (actrow[j] == rule)
static void
-save_row (int state)
+save_row (state_number_t state)
{
- int i;
+ symbol_number_t i;
int count;
short *sp = NULL;
short *sp1 = NULL;
static void
token_actions (void)
{
- size_t i;
+ state_number_t i;
int nconflict = conflicts_total_count ();
short *yydefact = XCALLOC (short, nstates);
void
actions_output (FILE *out)
{
- int rule;
+ rule_number_t r;
fputs ("m4_define([b4_actions], \n[[", out);
- for (rule = 1; rule < nrules + 1; ++rule)
- if (rules[rule].action)
+ for (r = 1; r < nrules + 1; ++r)
+ if (rules[r].action)
{
- fprintf (out, " case %d:\n", rule);
+ fprintf (out, " case %d:\n", r);
if (!no_lines_flag)
fprintf (out, muscle_find ("linef"),
- rules[rule].action_location.first_line,
+ rules[r].action_location.first_line,
quotearg_style (c_quoting_style,
muscle_find ("filename")));
fprintf (out, " %s\n break;\n\n",
- rules[rule].action);
+ rules[r].action);
}
fputs ("]])\n\n", out);
}
| Output the merge functions to OUT. |
`--------------------------------------*/
-void
+static void
merger_output (FILE *out)
{
int n;
static void
-save_column (int symbol, int default_state)
+save_column (symbol_number_t symbol, state_number_t default_state)
{
int i;
short *sp;
short *sp1;
short *sp2;
int count;
- int symno = symbol - ntokens + nstates;
+ int symno = symbol - ntokens + state_number_as_int (nstates);
- short begin = goto_map[symbol];
- short end = goto_map[symbol + 1];
+ int begin = goto_map[symbol];
+ int end = goto_map[symbol + 1];
count = 0;
for (i = begin; i < end; i++)
width[symno] = sp1[-1] - sp[0] + 1;
}
-static int
-default_goto (int symbol)
+
+static state_number_t
+default_goto (symbol_number_t symbol)
{
- size_t i;
- size_t m = goto_map[symbol];
- size_t n = goto_map[symbol + 1];
- int default_state = -1;
+ state_number_t s;
+ int i;
+ int m = goto_map[symbol];
+ int n = goto_map[symbol + 1];
+ state_number_t default_state = (state_number_t) -1;
int max = 0;
if (m == n)
- return -1;
+ return (state_number_t) -1;
- for (i = 0; i < nstates; i++)
- state_count[i] = 0;
+ for (s = 0; s < nstates; s++)
+ state_count[s] = 0;
for (i = m; i < n; i++)
state_count[to_state[i]]++;
- for (i = 0; i < nstates; i++)
- if (state_count[i] > max)
+ for (s = 0; s < nstates; s++)
+ if (state_count[s] > max)
{
- max = state_count[i];
- default_state = i;
+ max = state_count[s];
+ default_state = s;
}
return default_state;
static void
goto_actions (void)
{
- int i;
- short *yydefgoto = XMALLOC (short, nsyms - ntokens);
+ symbol_number_t i;
+ state_number_t *yydefgoto = XMALLOC (state_number_t, nsyms - ntokens);
state_count = XCALLOC (short, nstates);
for (i = ntokens; i < nsyms; ++i)
{
- int default_state = default_goto (i);
+ state_number_t default_state = default_goto (i);
save_column (i, default_state);
yydefgoto[i - ntokens] = default_state;
}
- muscle_insert_short_table ("defgoto", yydefgoto,
- yydefgoto[0], 1, nsyms - ntokens);
+ muscle_insert_state_number_table ("defgoto", yydefgoto,
+ yydefgoto[0], 1, nsyms - ntokens);
XFREE (state_count);
XFREE (yydefgoto);
}
for (k = 0; ok && k < t; k++)
{
- loc = j + from[k];
+ loc = j + state_number_as_int (from[k]);
if (loc > (int) table_size)
table_grow (loc);
{
for (k = 0; k < t; k++)
{
- loc = j + from[k];
- table[loc] = to[k];
+ loc = j + state_number_as_int (from[k]);
+ table[loc] = state_number_as_int (to[k]);
if (glr_parser && conflict_to != NULL)
conflict_table[loc] = conflict_to[k];
- check[loc] = from[k];
+ check[loc] = state_number_as_int (from[k]);
}
while (table[lowzero] != 0)
static void
output_actions (void)
{
- size_t i;
- nvectors = nstates + nvars;
+ /* That's a poor way to make sure the sizes are properly corelated,
+ in particular the signedness is not taking into account, but it's
+ not useless. */
+ assert (sizeof (nvectors) >= sizeof (nstates));
+ assert (sizeof (nvectors) >= sizeof (nvars));
+
+ nvectors = state_number_as_int (nstates) + nvars;
froms = XCALLOC (short *, nvectors);
tos = XCALLOC (short *, nvectors);
output_conflicts ();
output_check ();
-
- for (i = 0; i < nstates; ++i)
- {
- free (states[i]->shifts);
- XFREE (states[i]->reductions);
- free (states[i]->errs);
- free (states[i]);
- }
- XFREE (states);
}
\f
MUSCLE_INSERT_INT ("pure", pure_parser);
MUSCLE_INSERT_INT ("nsym", nsyms);
MUSCLE_INSERT_INT ("debug", debug_flag);
- MUSCLE_INSERT_INT ("final", final_state);
+ MUSCLE_INSERT_INT ("final", final_state->number);
MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
MUSCLE_INSERT_INT ("error_verbose", error_verbose);