X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/a49aecd528ab271f49fa76a482abbd84ce216b46..9801d40c506b718971aed52c44975c7951bcb3bc:/src/reduce.c diff --git a/src/reduce.c b/src/reduce.c index 4ac89197..35aab2e7 100644 --- a/src/reduce.c +++ b/src/reduce.c @@ -165,9 +165,9 @@ inaccessable_symbols (void) Pp = bitset_create (nrules + 1, BITSET_FIXED); /* If the start symbol isn't useful, then nothing will be useful. */ - if (bitset_test (N, start_symbol - ntokens)) + if (bitset_test (N, axiom->number - ntokens)) { - bitset_set (V, start_symbol); + bitset_set (V, axiom->number); while (1) { @@ -227,11 +227,19 @@ inaccessable_symbols (void) static void reduce_grammar_tables (void) { - /* Flag useless productions. */ + /* Report and flag useless productions. */ { - int pn; - for (pn = 1; pn < nrules + 1; pn++) - rules[pn].useful = bitset_test (P, pn); + int r; + for (r = 1; r < nrules + 1; r++) + { + rules[r].useful = bitset_test (P, r); + if (!rules[r].useful) + { + LOCATION_PRINT (stderr, rules[r].location); + fprintf (stderr, ": %s: %s: ", _("warning"), _("useless rule")); + rule_print (&rules[r], stderr); + } + } } /* Map the nonterminals to their new index: useful first, useless @@ -290,7 +298,13 @@ nonterminals_reduce (void) nontermmap[i] = n++; for (i = ntokens; i < nsyms; i++) if (!bitset_test (V, i)) - nontermmap[i] = n++; + { + nontermmap[i] = n++; + LOCATION_PRINT (stderr, symbols[i]->location); + fprintf (stderr, ": %s: %s: %s\n", + _("warning"), _("useless nonterminal"), + symbol_tag_get (symbols[i])); + } /* Shuffle elements of tables indexed by symbol number. */ @@ -315,7 +329,7 @@ nonterminals_reduce (void) if (ISVAR (*rhsp)) *rhsp = symbol_number_as_item_number (nontermmap[*rhsp]); } - start_symbol = nontermmap[start_symbol]; + axiom->number = nontermmap[axiom->number]; } nsyms -= nuseless_nonterminals; @@ -337,8 +351,7 @@ reduce_output (FILE *out) int i; fprintf (out, "%s\n\n", _("Useless nonterminals:")); for (i = 0; i < nuseless_nonterminals; ++i) - fprintf (out, " %s\n", quotearg_style (escape_quoting_style, - symbols[nsyms + i]->tag)); + fprintf (out, " %s\n", symbol_tag_get (symbols[nsyms + i])); fputs ("\n\n", out); } @@ -351,30 +364,16 @@ reduce_output (FILE *out) if (!b) fprintf (out, "%s\n\n", _("Terminals which are not used:")); b = TRUE; - fprintf (out, " %s\n", quotearg_style (escape_quoting_style, - symbols[i]->tag)); + fprintf (out, " %s\n", symbol_tag_get (symbols[i])); } if (b) fputs ("\n\n", out); } if (nuseless_productions > 0) - { - int i; - fprintf (out, "%s\n\n", _("Useless rules:")); - for (i = nrules + 1; i < nuseless_productions + nrules + 1; i++) - { - item_number_t *r; - fprintf (out, "#%-4d ", rules[i].user_number - 1); - fprintf (out, "%s:", quotearg_style (escape_quoting_style, - rules[i].lhs->tag)); - for (r = rules[i].rhs; *r >= 0; r++) - fprintf (out, " %s", quotearg_style (escape_quoting_style, - symbols[*r]->tag)); - fputs (";\n", out); - } - fputs ("\n\n", out); - } + grammar_rules_partial_print (out, _("Useless rules"), + nrules + 1, + nuseless_productions + nrules + 1); } @@ -394,7 +393,7 @@ reduce_print (void) nuseless_productions), nuseless_productions); - fprintf (stderr, _("%s contains "), infile); + fprintf (stderr, "%s: %s: ", infile, _("warning")); if (nuseless_nonterminals > 0) fprintf (stderr, ngettext ("%d useless nonterminal", @@ -435,9 +434,9 @@ reduce_grammar (void) reduce_print (); - if (!bitset_test (N, start_symbol - ntokens)) + if (!bitset_test (N, axiom->number - ntokens)) fatal (_("Start symbol %s does not derive any sentence"), - quotearg_style (escape_quoting_style, symbols[start_symbol]->tag)); + symbol_tag_get (symbols[axiom->number])); /* First reduce the nonterminals, as they renumber themselves in the whole grammar. If you change the order, nonterms would be