X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/796d61fbdd7bd5db9947451a204c76b5d046b308..ec2da99ffe7140db191d6683c493ad6936174311:/src/output.c diff --git a/src/output.c b/src/output.c index 34560bb5..34ff7d36 100644 --- a/src/output.c +++ b/src/output.c @@ -121,7 +121,7 @@ static int lowzero; static int high; struct obstack muscle_obstack; -struct obstack output_obstack; +static struct obstack format_obstack; int error_verbose = 0; @@ -130,14 +130,12 @@ static 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 (s[i] == '\n') + ++lines; + return lines; } @@ -148,8 +146,8 @@ static inline void output_table_data (struct obstack *oout, short *table_data, short first, - short begin, - short end) + int begin, + int end) { int i; int j = 1; @@ -174,9 +172,9 @@ output_table_data (struct obstack *oout, static void output_token_translations (void) { - output_table_data (&output_obstack, token_translations, + output_table_data (&format_obstack, token_translations, 0, 1, max_user_token_number + 1); - muscle_insert ("translate", obstack_finish (&output_obstack)); + muscle_insert ("translate", obstack_finish (&format_obstack)); XFREE (token_translations); } @@ -189,12 +187,12 @@ output_gram (void) short *values = XCALLOC (short, nrules + 1); for (i = 0; i < nrules + 1; ++i) values[i] = rule_table[i].rhs; - output_table_data (&output_obstack, values, + output_table_data (&format_obstack, values, 0, 1, nrules + 1); XFREE (values); } - muscle_insert ("prhs", obstack_finish (&output_obstack)); + muscle_insert ("prhs", obstack_finish (&format_obstack)); { size_t yyrhs_size = 1; @@ -208,9 +206,9 @@ output_gram (void) for (sp = ritem + 1, i = 1; *sp; ++sp, ++i) yyrhs[i] = *sp > 0 ? *sp : 0; - output_table_data (&output_obstack, yyrhs, + output_table_data (&format_obstack, yyrhs, ritem[0], 1, yyrhs_size); - muscle_insert ("rhs", obstack_finish (&output_obstack)); + muscle_insert ("rhs", obstack_finish (&format_obstack)); XFREE (yyrhs); } @@ -229,9 +227,9 @@ output_stos (void) short *values = (short *) alloca (sizeof (short) * nstates); for (i = 0; i < nstates; ++i) values[i] = state_table[i]->accessing_symbol; - output_table_data (&output_obstack, values, + output_table_data (&format_obstack, values, 0, 1, nstates); - muscle_insert ("stos", obstack_finish (&output_obstack)); + muscle_insert ("stos", obstack_finish (&format_obstack)); } @@ -246,9 +244,9 @@ output_rule_data (void) short *values = XCALLOC (short, nrules + 1); for (i = 0; i < nrules + 1; ++i) values[i] = rule_table[i].line; - output_table_data (&output_obstack, values, + output_table_data (&format_obstack, values, 0, 1, nrules + 1); - muscle_insert ("rline", obstack_finish (&output_obstack)); + muscle_insert ("rline", obstack_finish (&format_obstack)); XFREE (values); } @@ -266,34 +264,34 @@ output_rule_data (void) if (j + strsize > 75) { - obstack_sgrow (&output_obstack, "\n "); + obstack_sgrow (&format_obstack, "\n "); j = 2; } - obstack_sgrow (&output_obstack, cp); - obstack_sgrow (&output_obstack, ", "); + obstack_sgrow (&format_obstack, cp); + obstack_sgrow (&format_obstack, ", "); j += strsize; } /* add a NULL entry to list of tokens */ - obstack_sgrow (&output_obstack, "NULL"); + obstack_sgrow (&format_obstack, "NULL"); /* Finish table and store. */ - obstack_1grow (&output_obstack, 0); - muscle_insert ("tname", obstack_finish (&output_obstack)); + obstack_1grow (&format_obstack, 0); + muscle_insert ("tname", obstack_finish (&format_obstack)); /* Output YYTOKNUM. */ - output_table_data (&output_obstack, user_toknums, + output_table_data (&format_obstack, user_toknums, 0, 1, ntokens + 1); - muscle_insert ("toknum", obstack_finish (&output_obstack)); + muscle_insert ("toknum", obstack_finish (&format_obstack)); /* Output YYR1. */ { short *values = XCALLOC (short, nrules + 1); for (i = 0; i < nrules + 1; ++i) values[i] = rule_table[i].lhs; - output_table_data (&output_obstack, values, + output_table_data (&format_obstack, values, 0, 1, nrules + 1); - muscle_insert ("r1", obstack_finish (&output_obstack)); + muscle_insert ("r1", obstack_finish (&format_obstack)); XFREE (values); } @@ -302,9 +300,9 @@ output_rule_data (void) for (i = 1; i < nrules; i++) short_tab[i] = rule_table[i + 1].rhs - rule_table[i].rhs - 1; short_tab[nrules] = nitems - rule_table[nrules].rhs - 1; - output_table_data (&output_obstack, short_tab, + output_table_data (&format_obstack, short_tab, 0, 1, nrules + 1); - muscle_insert ("r2", obstack_finish (&output_obstack)); + muscle_insert ("r2", obstack_finish (&format_obstack)); XFREE (short_tab); } @@ -323,58 +321,41 @@ output_rule_data (void) `------------------------------------------------------------------*/ static int -action_row (int state) +action_row (state_t *state) { int i; - int j; - int m = 0; - int n = 0; - int default_rule; - int nreds; - int rule; - int shift_state; - int symbol; - reductions *redp; - shifts *shiftp; - errs *errp; - int nodefault = 0; /* set nonzero to inhibit having any default reduction */ + 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; - default_rule = 0; - nreds = 0; - redp = state_table[state]->reductions; - - if (redp) + if (redp->nreds >= 1) { - nreds = redp->nreds; - - if (nreds >= 1) - { - /* loop over all the rules available here which require - lookahead */ - m = state_table[state]->lookaheads; - n = state_table[state + 1]->lookaheads; - - for (i = n - 1; i >= m; 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 (BITISSET (LA (i), j)) - actrow[j] = -LAruleno[i]; - } + 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 (BITISSET (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. */ - shiftp = state_table[state]->shifts; for (i = 0; i < shiftp->nshifts; i++) { - shift_state = shiftp->shifts[i]; + int symbol; + int shift_state = shiftp->shifts[i]; if (!shift_state) continue; @@ -393,35 +374,31 @@ action_row (int state) /* See which tokens are an explicit error in this state (due to %nonassoc). For them, record MINSHORT as the action. */ - errp = state_table[state]->errs; - - if (errp) - for (i = 0; i < errp->nerrs; i++) - { - symbol = errp->errs[i]; - actrow[symbol] = MINSHORT; - } + 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 (nreds >= 1 && !nodefault) + if (redp->nreds >= 1 && !nodefault) { - if (state_table[state]->consistent) + if (state->consistent) default_rule = redp->rules[0]; else { int max = 0; - for (i = m; i < n; i++) + for (i = 0; i < state->nlookaheads; i++) { int count = 0; - rule = -LAruleno[i]; + int rule = -LAruleno[state->lookaheadsp + i]; + int j; for (j = 0; j < ntokens; j++) - { - if (actrow[j] == rule) - count++; - } + if (actrow[j] == rule) + count++; if (count > max) { @@ -435,11 +412,10 @@ action_row (int state) if (max > 0) { + int j; for (j = 0; j < ntokens; j++) - { - if (actrow[j] == default_rule) - actrow[j] = 0; - } + if (actrow[j] == default_rule) + actrow[j] = 0; default_rule = -default_rule; } @@ -450,11 +426,9 @@ action_row (int state) So replace any action which says "error" with "use default". */ if (default_rule == 0) - for (j = 0; j < ntokens; j++) - { - if (actrow[j] == MINSHORT) - actrow[j] = 0; - } + for (i = 0; i < ntokens; i++) + if (actrow[i] == MINSHORT) + actrow[i] = 0; return default_rule; } @@ -509,13 +483,13 @@ token_actions (void) actrow = XCALLOC (short, ntokens); for (i = 0; i < nstates; ++i) { - yydefact[i] = action_row (i); + yydefact[i] = action_row (state_table[i]); save_row (i); } - output_table_data (&output_obstack, yydefact, + output_table_data (&format_obstack, yydefact, yydefact[0], 1, nstates); - muscle_insert ("defact", obstack_finish (&output_obstack)); + muscle_insert ("defact", obstack_finish (&format_obstack)); XFREE (actrow); XFREE (yydefact); @@ -558,6 +532,38 @@ actions_output (FILE *out, size_t *line) } +/*----------------------------. +| Output the guards to OOUT. | +`----------------------------*/ + +static void +guards_output (FILE *out, size_t *line) +{ + int rule; + for (rule = 1; rule < nrules + 1; ++rule) + if (rule_table[rule].action) + { + fprintf (out, " case %d:\n", rule); + + if (!no_lines_flag) + fprintf (out, muscle_find ("linef"), + rule_table[rule].guard_line, + quotearg_style (c_quoting_style, + muscle_find ("filename"))); + fprintf (out, "{ %s; }\n break;\n\n", + rule_table[rule].guard); + + /* We always output 4 '\n' per action. */ + *line += 4; + /* Plus one if !no_lines_flag. */ + if (!no_lines_flag) + ++*line; + /* Get the number of lines written by the user. */ + *line += get_lines_number (rule_table[rule].guard); + } +} + + static void save_column (int symbol, int default_state) { @@ -566,7 +572,7 @@ save_column (int symbol, int default_state) short *sp1; short *sp2; int count; - int symno; + int symno = symbol - ntokens + nstates; short begin = goto_map[symbol]; short end = goto_map[symbol + 1]; @@ -579,8 +585,6 @@ save_column (int symbol, int default_state) if (count == 0) return; - symno = symbol - ntokens + nstates; - froms[symno] = sp1 = sp = XCALLOC (short, count); tos[symno] = sp2 = XCALLOC (short, count); @@ -599,13 +603,10 @@ static int default_goto (int symbol) { int i; - int m; - int n; - int default_state; - int max; - - m = goto_map[symbol]; - n = goto_map[symbol + 1]; + int m = goto_map[symbol]; + int n = goto_map[symbol + 1]; + int default_state = -1; + int max = 0; if (m == n) return -1; @@ -616,9 +617,6 @@ default_goto (int symbol) for (i = m; i < n; i++) state_count[to_state[i]]++; - max = 0; - default_state = -1; - for (i = 0; i < nstates; i++) if (state_count[i] > max) { @@ -653,9 +651,9 @@ goto_actions (void) yydefgoto[i - ntokens] = default_state; } - output_table_data (&output_obstack, yydefgoto, + output_table_data (&format_obstack, yydefgoto, yydefgoto[0], 1, nsyms - ntokens); - muscle_insert ("defgoto", obstack_finish (&output_obstack)); + muscle_insert ("defgoto", obstack_finish (&format_obstack)); XFREE (state_count); XFREE (yydefgoto); @@ -669,10 +667,6 @@ static void sort_actions (void) { int i; - int j; - int k; - int t; - int w; order = XCALLOC (short, nvectors); nentries = 0; @@ -680,9 +674,10 @@ sort_actions (void) for (i = 0; i < nvectors; i++) if (tally[i] > 0) { - t = tally[i]; - w = width[i]; - j = nentries - 1; + int k; + int t = tally[i]; + int w = width[i]; + int j = nentries - 1; while (j >= 0 && (width[order[j]] < w)) j--; @@ -702,15 +697,11 @@ sort_actions (void) static int matching_state (int vector) { - int i; - int j; - int k; + int i = order[vector]; int t; int w; - int match; int prev; - i = order[vector]; if (i >= nstates) return -1; @@ -719,11 +710,13 @@ matching_state (int vector) for (prev = vector - 1; prev >= 0; prev--) { - j = order[prev]; + int j = order[prev]; + int k; + int match = 1; + if (width[j] != w || tally[j] != t) return -1; - match = 1; for (k = 0; match && k < t; k++) if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k]) match = 0; @@ -739,26 +732,19 @@ matching_state (int vector) static int pack_vector (int vector) { - int i; + int i = order[vector]; int j; - int k; - int t; + int t = tally[i]; int loc = 0; - int ok; - short *from; - short *to; - - i = order[vector]; - t = tally[i]; + short *from = froms[i]; + short *to = tos[i]; assert (t); - from = froms[i]; - to = tos[i]; - for (j = lowzero - from[0]; j < MAXTABLE; j++) { - ok = 1; + int k; + int ok = 1; for (k = 0; ok && k < t; k++) { @@ -792,8 +778,8 @@ pack_vector (int vector) return j; } } - - assert (!"pack_vector"); +#define pack_vector_succeeded 0 + assert (pack_vector_succeeded); return 0; } @@ -850,14 +836,14 @@ static void output_base (void) { /* Output pact. */ - output_table_data (&output_obstack, base, + output_table_data (&format_obstack, base, base[0], 1, nstates); - muscle_insert ("pact", obstack_finish (&output_obstack)); + muscle_insert ("pact", obstack_finish (&format_obstack)); /* Output pgoto. */ - output_table_data (&output_obstack, base, + output_table_data (&format_obstack, base, base[nstates], nstates + 1, nvectors); - muscle_insert ("pgoto", obstack_finish (&output_obstack)); + muscle_insert ("pgoto", obstack_finish (&format_obstack)); XFREE (base); } @@ -866,9 +852,9 @@ output_base (void) static void output_table (void) { - output_table_data (&output_obstack, table, + output_table_data (&format_obstack, table, table[0], 1, high + 1); - muscle_insert ("table", obstack_finish (&output_obstack)); + muscle_insert ("table", obstack_finish (&format_obstack)); XFREE (table); } @@ -876,9 +862,9 @@ output_table (void) static void output_check (void) { - output_table_data (&output_obstack, check, + output_table_data (&format_obstack, check, check[0], 1, high + 1); - muscle_insert ("check", obstack_finish (&output_obstack)); + muscle_insert ("check", obstack_finish (&format_obstack)); XFREE (check); } @@ -915,9 +901,9 @@ output_actions (void) for (i = 0; i < nstates; ++i) { - XFREE (state_table[i]->shifts); + free (state_table[i]->shifts); XFREE (state_table[i]->reductions); - XFREE (state_table[i]->errs); + free (state_table[i]->errs); free (state_table[i]); } XFREE (state_table); @@ -934,19 +920,24 @@ output_parser (const char *skel_filename, FILE *out) { int c; FILE *fskel; - size_t line; + size_t output_line; + size_t skeleton_line; fskel = xfopen (skel_filename, "r"); /* New output code. */ - line = 1; + output_line = 1; + skeleton_line = 1; c = getc (fskel); while (c != EOF) { if (c != '%') { if (c == '\n') - ++line; + { + ++output_line; + ++skeleton_line; + } putc (c, out); c = getc (fskel); } @@ -964,14 +955,18 @@ output_parser (const char *skel_filename, FILE *out) muscle_key = obstack_finish (&muscle_obstack); muscle_value = muscle_find (muscle_key); if (!strcmp (muscle_key, "actions")) - actions_output (out, &line); + actions_output (out, &output_line); + else if (!strcmp (muscle_key, "guards")) + guards_output (out, &output_line); else if (!strcmp (muscle_key, "line")) - fprintf (out, "%d", line); + fprintf (out, "%d", output_line); + else if (!strcmp (muscle_key, "skeleton-line")) + fprintf (out, "%d", skeleton_line); else if (muscle_value) { fputs (muscle_value, out); - line += get_lines_number (muscle_value); - } + output_line += get_lines_number (muscle_value); + } else { fputs ("%%", out); @@ -1042,7 +1037,6 @@ prepare (void) MUSCLE_INSERT_INT ("debug", debug_flag); MUSCLE_INSERT_INT ("final", final_state); MUSCLE_INSERT_INT ("maxtok", max_user_token_number); - MUSCLE_INSERT_INT ("ntbase", ntokens); MUSCLE_INSERT_INT ("error-verbose", error_verbose); MUSCLE_INSERT_STRING ("prefix", spec_name_prefix); @@ -1087,7 +1081,7 @@ yystype;\n\ for (i = ntokens; i < nsyms; i++) /* don't make these for dummy nonterminals made by gensym. */ if (*tags[i] != '@') - fprintf (out, "# define\tNT%s\t%d\n", tags[i], i); + fprintf (out, "# define NT%s\t%d\n", tags[i], i); } fprintf (out, "\n#endif /* not %s */\n", macro_name); @@ -1103,7 +1097,7 @@ yystype;\n\ void output (void) { - obstack_init (&output_obstack); + obstack_init (&format_obstack); output_token_translations (); output_gram (); @@ -1127,7 +1121,8 @@ output (void) header_output (); free (rule_table + 1); - obstack_free (&muscle_obstack, 0); - obstack_free (&output_obstack, 0); - obstack_free (&action_obstack, 0); + obstack_free (&muscle_obstack, NULL); + obstack_free (&format_obstack, NULL); + obstack_free (&action_obstack, NULL); + obstack_free (&attrs_obstack, NULL); }