From 760b53a84bfc0c79bac266414136936400769e33 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 30 Nov 2001 10:48:14 +0000 Subject: [PATCH] * src/reduce.c (nonterminals_reduce): Instead of throwing away useless nonterminals, move them at the end of the symbol arrays. (reduce_output): Adjust. * tests/reduce.at (Useless Nonterminals): Adjust. --- ChangeLog | 7 +++++++ src/reduce.c | 45 ++++++++++++++++++++++++++++----------------- tests/reduce.at | 6 ++++-- 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1606c8dd..afc46aa4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2001-11-30 Akim Demaille + + * src/reduce.c (nonterminals_reduce): Instead of throwing away + useless nonterminals, move them at the end of the symbol arrays. + (reduce_output): Adjust. + * tests/reduce.at (Useless Nonterminals): Adjust. + 2001-11-30 Akim Demaille * src/reduce.c: Various comment/formatting changes. diff --git a/src/reduce.c b/src/reduce.c index 911fb929..7e164c50 100644 --- a/src/reduce.c +++ b/src/reduce.c @@ -342,26 +342,38 @@ nonterminals_reduce (void) in the map means it was useless and is being eliminated. */ short *nontermmap = XCALLOC (short, nvars) - ntokens; - for (i = ntokens; i < nsyms; i++) - nontermmap[i] = -1; - n = ntokens; for (i = ntokens; i < nsyms; i++) if (BITISSET (V, i)) nontermmap[i] = n++; + for (i = ntokens; i < nsyms; i++) + if (!BITISSET (V, i)) + nontermmap[i] = n++; - /* Shuffle elements of tables indexed by symbol number. */ - for (i = ntokens; i < nsyms; i++) - { - n = nontermmap[i]; - if (n >= 0) - { - sassoc[n] = sassoc[i]; - sprec[n] = sprec[i]; - tags[n] = tags[i]; - } - } + /* Shuffle elements of tables indexed by symbol number. */ + { + short *sassoc_sorted = XMALLOC (short, nvars) - ntokens; + short *sprec_sorted = XMALLOC (short, nvars) - ntokens; + char **tags_sorted = XMALLOC (char *, nvars) - ntokens; + + for (i = ntokens; i < nsyms; i++) + { + n = nontermmap[i]; + sassoc_sorted[n] = sassoc[i]; + sprec_sorted[n] = sprec[i]; + tags_sorted[n] = tags[i]; + } + for (i = ntokens; i < nsyms; i++) + { + sassoc[i] = sassoc_sorted[i]; + sprec[i] = sprec_sorted[i]; + tags[i] = tags_sorted[i]; + } + free (sassoc_sorted + ntokens); + free (sprec_sorted + ntokens); + free (tags_sorted + ntokens); + } /* Replace all symbol numbers in valid data structures. */ @@ -403,9 +415,8 @@ reduce_output (FILE *out) { fprintf (out, _("Useless nonterminals:")); fprintf (out, "\n\n"); - for (i = ntokens; i < nsyms; i++) - if (!BITISSET (V, i)) - fprintf (out, " %s\n", tags[i]); + for (i = 0; i < nuseless_nonterminals; ++i) + fprintf (out, " %s\n", tags[nsyms + i]); } b = FALSE; for (i = 0; i < ntokens; i++) diff --git a/tests/reduce.at b/tests/reduce.at index ed3a5150..08601d50 100644 --- a/tests/reduce.at +++ b/tests/reduce.at @@ -88,10 +88,12 @@ AT_DATA([[input.y]], exp: useful; ]]) -AT_CHECK([[bison input.y]]) +AT_CHECK([[bison input.y]], 0, [], +[[input.y contains 9 useless nonterminals +]]) AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, -[[Terminals which are not used: +[[Useless nonterminals: useless1 useless2 useless3 -- 2.45.2