- int i, n;
-/* short j; JF unused */
- short *nontermmap;
- rule r;
-
- /* Create a map of nonterminal number to new nonterminal
- number. -1 in the map means it was useless and is being
- eliminated. */
-
- 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++;
-
- /* 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];
- }
- else
- {
- free (tags[i]);
- }
- }
-
- /* Replace all symbol numbers in valid data structures. */
-
- 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];
- if (ISVAR (rule_table[i].precsym))
- /* Can this happen? */
- rule_table[i].precsym = nontermmap[rule_table[i].precsym];
- }
-
- for (r = ritem; *r; r++)
- if (ISVAR (*r))
- *r = nontermmap[*r];
-
- start_symbol = nontermmap[start_symbol];
-
- nsyms -= nuseless_nonterminals;
- nvars -= nuseless_nonterminals;
-
- free (&nontermmap[ntokens]);
- }
+static void
+nonterminals_reduce (void)
+{
+ /* Map the nonterminals to their new index: useful first, useless
+ afterwards. Kept for later report. */
+
+ symbol_number *nontermmap = xnmalloc (nvars, sizeof *nontermmap);
+ symbol_number n = ntokens;
+ symbol_number i;
+ for (i = ntokens; i < nsyms; i++)
+ if (bitset_test (V, i))
+ nontermmap[i - ntokens] = n++;
+ for (i = ntokens; i < nsyms; i++)
+ if (!bitset_test (V, i))
+ {
+ nontermmap[i - ntokens] = n++;
+ if (symbols[i]->status != used)
+ complain (&symbols[i]->location, Wother,
+ _("nonterminal useless in grammar: %s"),
+ symbols[i]->tag);
+ }
+
+
+ /* Shuffle elements of tables indexed by symbol number. */
+ {
+ symbol **symbols_sorted = xnmalloc (nvars, sizeof *symbols_sorted);
+
+ for (i = ntokens; i < nsyms; i++)
+ symbols[i]->number = nontermmap[i - ntokens];
+ for (i = ntokens; i < nsyms; i++)
+ symbols_sorted[nontermmap[i - ntokens] - ntokens] = symbols[i];
+ for (i = ntokens; i < nsyms; i++)
+ symbols[i] = symbols_sorted[i - ntokens];
+ free (symbols_sorted);
+ }
+
+ {
+ rule_number r;
+ for (r = 0; r < nrules; ++r)
+ {
+ item_number *rhsp;
+ for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
+ if (ISVAR (*rhsp))
+ *rhsp = symbol_number_as_item_number (nontermmap[*rhsp
+ - ntokens]);
+ }
+ accept->number = nontermmap[accept->number - ntokens];
+ }
+
+ nsyms -= nuseless_nonterminals;
+ nvars -= nuseless_nonterminals;
+
+ free (nontermmap);