/* A production is useful if all of the nonterminals in its appear
in the set of useful nonterminals. */
- for (r = &ritem[rrhs[i]]; *r > 0; r++)
+ for (r = &ritem[rule_table[i].rhs]; *r > 0; r++)
if (ISVAR (n = *r))
if (!BITISSET (N0, n - ntokens))
return FALSE;
{
if (useful_production (i, N))
{
- SETBIT (Np, rlhs[i] - ntokens);
+ SETBIT (Np, rule_table[i].lhs - ntokens);
SETBIT (P, i);
}
}
Pp = XCALLOC (unsigned, WORDSIZE (nrules + 1));
/* If the start symbol isn't useful, then nothing will be useful. */
- if (!BITISSET (N, start_symbol - ntokens))
- goto end_iteration;
-
- SETBIT (V, start_symbol);
-
- while (1)
+ if (BITISSET (N, start_symbol - ntokens))
{
- for (i = WORDSIZE (nsyms) - 1; i >= 0; i--)
- Vp[i] = V[i];
- for (i = 1; i <= nrules; i++)
+ SETBIT (V, start_symbol);
+
+ while (1)
{
- if (!BITISSET (Pp, i) && BITISSET (P, i) && BITISSET (V, rlhs[i]))
+ for (i = WORDSIZE (nsyms) - 1; i >= 0; i--)
+ Vp[i] = V[i];
+ for (i = 1; i <= nrules; i++)
{
- for (r = &ritem[rrhs[i]]; *r >= 0; r++)
+ if (!BITISSET (Pp, i)
+ && BITISSET (P, i)
+ && BITISSET (V, rule_table[i].lhs))
{
- if (ISTOKEN (t = *r) || BITISSET (N, t - ntokens))
- {
+ for (r = &ritem[rule_table[i].rhs]; *r >= 0; r++)
+ if (ISTOKEN (t = *r) || BITISSET (N, t - ntokens))
SETBIT (Vp, t);
- }
+ SETBIT (Pp, i);
}
- SETBIT (Pp, i);
}
+ if (bits_equal (V, Vp, WORDSIZE (nsyms)))
+ break;
+ Vs = Vp;
+ Vp = V;
+ V = Vs;
}
- if (bits_equal (V, Vp, WORDSIZE (nsyms)))
- {
- break;
- }
- Vs = Vp;
- Vp = V;
- V = Vs;
}
-end_iteration:
XFREE (V);
V = Vp;
/* A token that was used in %prec should not be warned about. */
for (i = 1; i < nrules; i++)
- if (rprecsym[i] != 0)
- SETBIT (V1, rprecsym[i]);
+ if (rule_table[i].precsym != 0)
+ SETBIT (V1, rule_table[i].precsym);
}
static void
np++;
if (pn != np)
{
- rlhs[np] = rlhs[pn];
+ rule_table[np].lhs = rule_table[pn].lhs;
rline[np] = rline[pn];
- rprec[np] = rprec[pn];
- rassoc[np] = rassoc[pn];
- rrhs[np] = rrhs[pn];
- if (rrhs[np] != ni)
+ rule_table[np].prec = rule_table[pn].prec;
+ rule_table[np].assoc = rule_table[pn].assoc;
+ rule_table[np].rhs = rule_table[pn].rhs;
+ if (rule_table[np].rhs != ni)
{
- pi = rrhs[np];
- rrhs[np] = ni;
+ pi = rule_table[np].rhs;
+ rule_table[np].rhs = ni;
while (ritem[pi] >= 0)
ritem[ni++] = ritem[pi++];
ritem[ni++] = -np;
{
if (!BITISSET (P, pn))
{
- rlhs[pn] = -1;
+ rule_table[pn].lhs = -1;
}
}
}
for (i = 1; i <= nrules; i++)
{
/* Ignore the rules disabled above. */
- if (rlhs[i] >= 0)
- rlhs[i] = nontermmap[rlhs[i]];
- if (ISVAR (rprecsym[i]))
+ if (rule_table[i].lhs >= 0)
+ rule_table[i].lhs = nontermmap[rule_table[i].lhs];
+ if (ISVAR (rule_table[i].precsym))
/* Can this happen? */
- rprecsym[i] = nontermmap[rprecsym[i]];
+ rule_table[i].precsym = nontermmap[rule_table[i].precsym];
}
for (r = ritem; *r; r++)
fprintf (out, _("Useless rules:"));
fprintf (out, "\n\n");
for (i = 1; i <= nrules; i++)
- {
- if (!BITISSET (P, i))
- {
- fprintf (out, "#%-4d ", i);
- fprintf (out, "%s :\t", tags[rlhs[i]]);
- for (r = &ritem[rrhs[i]]; *r >= 0; r++)
- fprintf (out, " %s", tags[*r]);
- fprintf (out, ";\n");
- }
- }
+ if (!BITISSET (P, i))
+ {
+ fprintf (out, "#%-4d ", i);
+ fprintf (out, "%s :\t", tags[rule_table[i].lhs]);
+ for (r = &ritem[rule_table[i].rhs]; *r >= 0; r++)
+ fprintf (out, " %s", tags[*r]);
+ fprintf (out, ";\n");
+ }
}
if (nuseless_nonterminals > 0 || nuseless_productions > 0 || b)
fprintf (out, "\n\n");
}
\f
-#if 0 /* XXX currently unused. */
static void
dump_grammar (FILE *out)
{
int i;
rule r;
+ fprintf (out, "REDUCED GRAMMAR\n\n");
fprintf (out,
"ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nitems = %d\n\n",
ntokens, nvars, nsyms, nrules, nitems);
for (i = 1; i <= nrules; i++)
{
fprintf (out, "%-5d(%5d%5d)%5d : (@%-5d)",
- i, rprec[i], rassoc[i], rlhs[i], rrhs[i]);
- for (r = &ritem[rrhs[i]]; *r > 0; r++)
+ i,
+ rule_table[i].prec,
+ rule_table[i].assoc,
+ rule_table[i].lhs,
+ rule_table[i].rhs);
+ for (r = &ritem[rule_table[i].rhs]; *r > 0; r++)
fprintf (out, "%5d", *r);
fprintf (out, " [%d]\n", -(*r));
}
fprintf (out, _("Rules interpreted\n-----------------\n\n"));
for (i = 1; i <= nrules; i++)
{
- fprintf (out, "%-5d %s :", i, tags[rlhs[i]]);
- for (r = &ritem[rrhs[i]]; *r > 0; r++)
+ fprintf (out, "%-5d %s :", i, tags[rule_table[i].lhs]);
+ for (r = &ritem[rule_table[i].rhs]; *r > 0; r++)
fprintf (out, " %s", tags[*r]);
fputc ('\n', out);
}
fprintf (out, "\n\n");
}
-#endif
tags[start_symbol]);
reduce_grammar_tables ();
-#if 0
- if (verbose_flag)
+
+ if (trace_flag)
{
- fprintf (out, "REDUCED GRAMMAR\n\n");
- dump_grammar ();
+ dump_grammar (stderr);
+
+ fprintf (stderr, "reduced %s defines %d terminals, %d nonterminals\
+, and %d productions.\n",
+ infile, ntokens, nvars, nrules);
}
-#endif
-
- if (statistics_flag)
- fprintf (stderr, _("reduced %s defines %d terminal%s, %d nonterminal%s\
-, and %d production%s.\n"),
- infile,
- ntokens,
- (ntokens == 1 ? "" : "s"),
- nvars,
- (nvars == 1 ? "" : "s"),
- nrules,
- (nrules == 1 ? "" : "s"));
}