X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/0c2d3f4cba35c4bbea660794ab3cf91c030aafd3..6b98e4b5636203b60c2a43ddaa988562616b4c69:/src/reduce.c diff --git a/src/reduce.c b/src/reduce.c index fd6f9e15..2319b60b 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 @@ -278,19 +286,25 @@ reduce_grammar_tables (void) static void nonterminals_reduce (void) { - token_number_t i, n; + symbol_number_t i, n; /* Map the nonterminals to their new index: useful first, useless afterwards. Kept for later report. */ - token_number_t *nontermmap = XCALLOC (token_number_t, nvars) - ntokens; + symbol_number_t *nontermmap = XCALLOC (symbol_number_t, nvars) - ntokens; n = ntokens; for (i = ntokens; i < nsyms; i++) if (bitset_test (V, i)) 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. */ @@ -313,9 +327,9 @@ nonterminals_reduce (void) item_number_t *rhsp; for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp) if (ISVAR (*rhsp)) - *rhsp = token_number_as_item_number (nontermmap[*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,8 +364,7 @@ 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); @@ -366,11 +378,9 @@ reduce_output (FILE *out) { item_number_t *r; fprintf (out, "#%-4d ", rules[i].user_number - 1); - fprintf (out, "%s:", quotearg_style (escape_quoting_style, - rules[i].lhs->tag)); + fprintf (out, "%s:", symbol_tag_get (rules[i].lhs)); for (r = rules[i].rhs; *r >= 0; r++) - fprintf (out, " %s", quotearg_style (escape_quoting_style, - symbols[*r]->tag)); + fprintf (out, " %s", symbol_tag_get (symbols[*r])); fputs (";\n", out); } fputs ("\n\n", out); @@ -394,7 +404,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 +445,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