X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/b0940840ac770c0205c395e90a1a598e03cb79e8..e91ff6ce3d2653b41265591dafd4bdb32ae114c2:/src/output.c diff --git a/src/output.c b/src/output.c index a098cb63..f8cb5350 100644 --- a/src/output.c +++ b/src/output.c @@ -122,6 +122,11 @@ static short *state_count = NULL; static short *order = NULL; static short *base = NULL; static short *pos = NULL; + +/* TABLE_SIZE is the allocated size of both TABLE and CHECK. + We start with the original hard-coded value: SHRT_MAX + (yes, not USHRT_MAX). */ +static size_t table_size = SHRT_MAX; static short *table = NULL; static short *check = NULL; static int lowzero; @@ -132,50 +137,82 @@ static struct obstack format_obstack; int error_verbose = 0; -/* Returns the number of lines of S. */ -size_t -get_lines_number (const char *s) -{ - size_t lines = 0; - size_t i; - for (i = 0; s[i]; ++i) - if (s[i] == '\n') - ++lines; +/*----------------------------------------------------------------. +| If TABLE (and CHECK) appear to be small to be addressed at | +| DESIRED, grow them. Note that TABLE[DESIRED] is to be used, so | +| the desired size is at least DESIRED + 1. | +`----------------------------------------------------------------*/ - return lines; -} +static void +table_grow (size_t desired) +{ + size_t old_size = table_size; + while (table_size <= desired) + table_size *= 2; -/* FIXME. */ + if (trace_flag) + fprintf (stderr, "growing table and check from: %d to %d\n", + old_size, table_size); -static inline void -output_table_data (struct obstack *oout, - short *table_data, - short first, - int begin, - int end) -{ - int i; - int j = 1; + table = XREALLOC (table, short, table_size); + check = XREALLOC (check, short, table_size); - obstack_fgrow1 (oout, "%6d", first); - for (i = begin; i < end; ++i) + for (/* Nothing. */; old_size < table_size; ++old_size) { - obstack_1grow (oout, ','); - if (j >= 10) - { - obstack_sgrow (oout, "\n "); - j = 1; - } - else - ++j; - obstack_fgrow1 (oout, "%6d", table_data[i]); + table[old_size] = 0; + check[old_size] = -1; } - obstack_1grow (oout, 0); } +/*------------------------------------------------------------------. +| Create a function NAME which Format the FIRST and then | +| TABLE_DATA[BEGIN..END[ (of TYPE) into OOUT, and return the number | +| of bits needed for its longuest value. | +`------------------------------------------------------------------*/ + + +#define GENERATE_OUTPUT_TABLE(Name, Type) \ + \ +static inline long int \ +Name (struct obstack *oout, \ + Type *table_data, \ + Type first, \ + int begin, \ + int end) \ +{ \ + long int max = first; \ + int i; \ + int j = 1; \ + \ + obstack_fgrow1 (oout, "%6d", first); \ + for (i = begin; i < end; ++i) \ + { \ + obstack_1grow (oout, ','); \ + if (j >= 10) \ + { \ + obstack_sgrow (oout, "\n "); \ + j = 1; \ + } \ + else \ + ++j; \ + obstack_fgrow1 (oout, "%6d", table_data[i]); \ + if (table_data[i] > max) \ + max = table_data[i]; \ + } \ + obstack_1grow (oout, 0); \ + \ + return max; \ +} + +GENERATE_OUTPUT_TABLE(output_int_table, int) +GENERATE_OUTPUT_TABLE(output_short_table, short) +GENERATE_OUTPUT_TABLE(output_token_number_table, token_number_t) +GENERATE_OUTPUT_TABLE(output_item_number_table, item_number_t) + + /*-----------------------------------------------------------------. | Prepare the muscles related to the tokens: translate, tname, and | | toknum. | @@ -184,9 +221,11 @@ output_table_data (struct obstack *oout, static void prepare_tokens (void) { - output_table_data (&format_obstack, token_translations, - 0, 1, max_user_token_number + 1); + long int max = output_token_number_table (&format_obstack, + token_translations, + 0, 1, max_user_token_number + 1); muscle_insert ("translate", obstack_finish (&format_obstack)); + MUSCLE_INSERT_LONG_INT ("token_number_max", max); XFREE (token_translations); { @@ -228,7 +267,7 @@ prepare_tokens (void) short *values = XCALLOC (short, ntokens + 1); for (i = 0; i < ntokens + 1; ++i) values[i] = symbols[i]->user_token_number; - output_table_data (&format_obstack, values, + output_short_table (&format_obstack, values, 0, 1, ntokens + 1); muscle_insert ("toknum", obstack_finish (&format_obstack)); free (values); @@ -244,12 +283,13 @@ prepare_tokens (void) static void prepare_rules (void) { - short *rhsp; + long int max; + item_number_t *rhsp; int r; int i = 0; - short *rhs = XMALLOC (short, nritems); + item_number_t *rhs = XMALLOC (item_number_t, nritems); short *prhs = XMALLOC (short, nrules + 1); - short *r1 = XMALLOC (short, nrules + 1); + token_number_t *r1 = XMALLOC (token_number_t, nrules + 1); short *r2 = XMALLOC (short, nrules + 1); short *rline = XMALLOC (short, nrules + 1); @@ -271,19 +311,20 @@ prepare_rules (void) } assert (i == nritems); - output_table_data (&format_obstack, rhs, ritem[0], 1, nritems); + max = output_int_table (&format_obstack, rhs, ritem[0], 1, nritems); muscle_insert ("rhs", obstack_finish (&format_obstack)); + MUSCLE_INSERT_LONG_INT ("rhs_number_max", max); - output_table_data (&format_obstack, prhs, 0, 1, nrules + 1); + output_short_table (&format_obstack, prhs, 0, 1, nrules + 1); muscle_insert ("prhs", obstack_finish (&format_obstack)); - output_table_data (&format_obstack, rline, 0, 1, nrules + 1); + output_short_table (&format_obstack, rline, 0, 1, nrules + 1); muscle_insert ("rline", obstack_finish (&format_obstack)); - output_table_data (&format_obstack, r1, 0, 1, nrules + 1); + output_token_number_table (&format_obstack, r1, 0, 1, nrules + 1); muscle_insert ("r1", obstack_finish (&format_obstack)); - output_table_data (&format_obstack, r2, 0, 1, nrules + 1); + output_short_table (&format_obstack, r2, 0, 1, nrules + 1); muscle_insert ("r2", obstack_finish (&format_obstack)); free (rhs); @@ -299,11 +340,12 @@ static void prepare_states (void) { size_t i; - short *values = (short *) alloca (sizeof (short) * nstates); + token_number_t *values = + (token_number_t *) alloca (sizeof (token_number_t) * nstates); for (i = 0; i < nstates; ++i) values[i] = states[i]->accessing_symbol; - output_table_data (&format_obstack, values, - 0, 1, nstates); + output_token_number_table (&format_obstack, values, + 0, 1, nstates); muscle_insert ("stos", obstack_finish (&format_obstack)); } @@ -314,7 +356,7 @@ prepare_states (void) | default action (yydefact) for the state. In addition, actrow is | | filled with what to do for each kind of token, index by symbol | | number, with zero meaning do the default action. The value | -| MINSHORT, a very negative number, means this situation is an | +| SHRT_MIN, a very negative number, means this situation is an | | error. The parser recognizes this value specially. | | | | This is where conflicts are resolved. The loop over lookahead | @@ -348,7 +390,7 @@ action_row (state_t *state) /* 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]; + actrow[j] = -LArule[state->lookaheadsp + i]->number; } /* Now see which tokens are allowed for shifts in this state. For @@ -356,7 +398,7 @@ action_row (state_t *state) to reduce. */ for (i = 0; i < shiftp->nshifts; i++) { - int symbol; + token_number_t symbol; int shift_state = shiftp->shifts[i]; if (!shift_state) continue; @@ -370,16 +412,16 @@ action_row (state_t *state) /* Do not use any default reduction if there is a shift for error */ - if (symbol == error_token_number) + if (symbol == errtoken->number) nodefault = 1; } /* See which tokens are an explicit error in this state (due to - %nonassoc). For them, record MINSHORT as the action. */ + %nonassoc). For them, record SHRT_MIN as the action. */ for (i = 0; i < errp->nerrs; i++) { int symbol = errp->errs[i]; - actrow[symbol] = MINSHORT; + actrow[symbol] = SHRT_MIN; } /* Now find the most common reduction and make it the default action @@ -395,7 +437,7 @@ action_row (state_t *state) for (i = 0; i < state->nlookaheads; i++) { int count = 0; - int rule = -LAruleno[state->lookaheadsp + i]; + int rule = -LArule[state->lookaheadsp + i]->number; int j; for (j = 0; j < ntokens; j++) @@ -429,7 +471,7 @@ action_row (state_t *state) if (default_rule == 0) for (i = 0; i < ntokens; i++) - if (actrow[i] == MINSHORT) + if (actrow[i] == SHRT_MIN) actrow[i] = 0; return default_rule; @@ -489,7 +531,7 @@ token_actions (void) save_row (i); } - output_table_data (&format_obstack, yydefact, + output_short_table (&format_obstack, yydefact, yydefact[0], 1, nstates); muscle_insert ("defact", obstack_finish (&format_obstack)); @@ -561,13 +603,13 @@ token_definitions_output (FILE *out) int first = 1; for (i = 0; i < ntokens; ++i) { - bucket *symbol = symbols[i]; + symbol_t *symbol = symbols[i]; int number = symbol->user_token_number; if (number == SALIAS) continue; /* Skip error token. */ - if (symbol->number == error_token_number) + if (symbol == errtoken) continue; if (symbol->tag[0] == '\'') continue; /* skip literal character */ @@ -683,7 +725,7 @@ goto_actions (void) yydefgoto[i - ntokens] = default_state; } - output_table_data (&format_obstack, yydefgoto, + output_short_table (&format_obstack, yydefgoto, yydefgoto[0], 1, nsyms - ntokens); muscle_insert ("defgoto", obstack_finish (&format_obstack)); @@ -773,7 +815,7 @@ pack_vector (int vector) assert (t); - for (j = lowzero - from[0]; j < MAXTABLE; j++) + for (j = lowzero - from[0]; j < (int) table_size; j++) { int k; int ok = 1; @@ -781,8 +823,8 @@ pack_vector (int vector) for (k = 0; ok && k < t; k++) { loc = j + from[k]; - if (loc > MAXTABLE) - fatal (_("maximum table size (%d) exceeded"), MAXTABLE); + if (loc > (int) table_size) + table_grow (loc); if (table[loc] != 0) ok = 0; @@ -825,16 +867,16 @@ pack_table (void) base = XCALLOC (short, nvectors); pos = XCALLOC (short, nentries); - table = XCALLOC (short, MAXTABLE); - check = XCALLOC (short, MAXTABLE); + table = XCALLOC (short, table_size); + check = XCALLOC (short, table_size); lowzero = 0; high = 0; for (i = 0; i < nvectors; i++) - base[i] = MINSHORT; + base[i] = SHRT_MIN; - for (i = 0; i < MAXTABLE; i++) + for (i = 0; i < (int) table_size; i++) check[i] = -1; for (i = 0; i < nentries; i++) @@ -868,12 +910,12 @@ static void output_base (void) { /* Output pact. */ - output_table_data (&format_obstack, base, + output_short_table (&format_obstack, base, base[0], 1, nstates); muscle_insert ("pact", obstack_finish (&format_obstack)); /* Output pgoto. */ - output_table_data (&format_obstack, base, + output_short_table (&format_obstack, base, base[nstates], nstates + 1, nvectors); muscle_insert ("pgoto", obstack_finish (&format_obstack)); @@ -884,7 +926,7 @@ output_base (void) static void output_table (void) { - output_table_data (&format_obstack, table, + output_short_table (&format_obstack, table, table[0], 1, high + 1); muscle_insert ("table", obstack_finish (&format_obstack)); XFREE (table); @@ -894,7 +936,7 @@ output_table (void) static void output_check (void) { - output_table_data (&format_obstack, check, + output_short_table (&format_obstack, check, check[0], 1, high + 1); muscle_insert ("check", obstack_finish (&format_obstack)); XFREE (check); @@ -918,7 +960,7 @@ output_actions (void) token_actions (); bitsetv_free (LA); - XFREE (LAruleno); + free (LArule); goto_actions (); XFREE (goto_map + ntokens); @@ -1024,12 +1066,13 @@ static void prepare (void) { MUSCLE_INSERT_INT ("last", high); - MUSCLE_INSERT_INT ("flag", MINSHORT); + MUSCLE_INSERT_INT ("flag", SHRT_MIN); 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 ("maxtok", max_user_token_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); MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");