X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/d2d1b42b0730316f4f70eb416dcc767ffaaa2019..3067fbef531832df1e43bbd28787655808361eed:/src/reduce.c diff --git a/src/reduce.c b/src/reduce.c index 626c195c..048f5a63 100644 --- a/src/reduce.c +++ b/src/reduce.c @@ -310,20 +310,12 @@ reduce_grammar_tables (void) } #endif /* 0 */ - /* Disable useless productions, - since they may contain useless nonterms - that would get mapped below to -1 and confuse everyone. */ + /* Disable useless productions. */ if (nuseless_productions > 0) { int pn; - for (pn = 1; pn <= nrules; pn++) - { - if (!BITISSET (P, pn)) - { - rule_table[pn].lhs = -1; - } - } + rule_table[pn].useful = BITISSET (P, pn); } } @@ -338,8 +330,8 @@ nonterminals_reduce (void) int i, n; rule r; - /* Create a map of nonterminal number to new nonterminal number. -1 - in the map means it was useless and is being eliminated. */ + /* Map the nonterminals to their new index: useful first, useless + afterwards. Kept for later report. */ short *nontermmap = XCALLOC (short, nvars) - ntokens; n = ntokens; @@ -379,9 +371,7 @@ nonterminals_reduce (void) for (i = 1; i <= nrules; i++) { - /* Ignore the rules disabled above. */ - if (rule_table[i].lhs >= 0) - rule_table[i].lhs = nontermmap[rule_table[i].lhs]; + rule_table[i].lhs = nontermmap[rule_table[i].lhs]; if (ISVAR (rule_table[i].precsym)) /* Can this happen? */ rule_table[i].precsym = nontermmap[rule_table[i].precsym]; @@ -396,7 +386,7 @@ nonterminals_reduce (void) nsyms -= nuseless_nonterminals; nvars -= nuseless_nonterminals; - free (&nontermmap[ntokens]); + free (nontermmap + ntokens); } @@ -436,11 +426,11 @@ reduce_output (FILE *out) int i; fprintf (out, "%s\n\n", _("Useless rules:")); for (i = 1; i <= nrules; i++) - if (!BITISSET (P, i)) + if (!rule_table[i].useful) { rule r; fprintf (out, "#%-4d ", i); - fprintf (out, "%s :\t", tags[rule_table[i].lhs]); + fprintf (out, "%s:", tags[rule_table[i].lhs]); for (r = &ritem[rule_table[i].rhs]; *r >= 0; r++) fprintf (out, " %s", tags[*r]); fputs (";\n", out); @@ -465,18 +455,22 @@ dump_grammar (FILE *out) fprintf (out, "%5d %5d %5d %s\n", i, sprec[i], sassoc[i], tags[i]); fprintf (out, "\n\n"); fprintf (out, "Rules\n-----\n\n"); - fprintf (out, "Num (Prec, Assoc) Lhs : (@Rhs) Ritems [Num?]\n"); + fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n"); for (i = 1; i <= nrules; i++) { - fprintf (out, "%-5d(%5d%5d)%5d : (@%-5d)", + int rhs_count = 0; + /* Find the last RHS index in ritems. */ + for (r = &ritem[rule_table[i].rhs]; *r > 0; ++r) + ++rhs_count; + fprintf (out, "%3d (%2d, %2d, %2d, %2d-%2d) %2d ->", i, - rule_table[i].prec, - rule_table[i].assoc, - rule_table[i].lhs, - rule_table[i].rhs); + rule_table[i].prec, rule_table[i].assoc, rule_table[i].useful, + rule_table[i].rhs, rule_table[i].rhs + rhs_count - 1, + rule_table[i].lhs); + /* Dumped the RHS. */ for (r = &ritem[rule_table[i].rhs]; *r > 0; r++) - fprintf (out, "%5d", *r); - fprintf (out, " [%d]\n", -(*r)); + fprintf (out, "%3d", *r); + fprintf (out, " [%d]\n", -(*r)); } fprintf (out, "\n\n"); fprintf (out, "Rules interpreted\n-----------------\n\n");