310 |
|
|
311 |
} |
} |
312 |
#endif /* 0 */ |
#endif /* 0 */ |
313 |
/* Disable useless productions, |
/* Disable useless productions. */ |
|
since they may contain useless nonterms |
|
|
that would get mapped below to -1 and confuse everyone. */ |
|
314 |
if (nuseless_productions > 0) |
if (nuseless_productions > 0) |
315 |
{ |
{ |
316 |
int pn; |
int pn; |
|
|
|
317 |
for (pn = 1; pn <= nrules; pn++) |
for (pn = 1; pn <= nrules; pn++) |
318 |
{ |
rule_table[pn].useful = BITISSET (P, pn); |
|
if (!BITISSET (P, pn)) |
|
|
{ |
|
|
rule_table[pn].lhs = -1; |
|
|
} |
|
|
} |
|
319 |
} |
} |
320 |
} |
} |
321 |
|
|
330 |
int i, n; |
int i, n; |
331 |
rule r; |
rule r; |
332 |
|
|
333 |
/* Create a map of nonterminal number to new nonterminal number. -1 |
/* Map the nonterminals to their new index: useful first, useless |
334 |
in the map means it was useless and is being eliminated. */ |
afterwards. Kept for later report. */ |
335 |
|
|
336 |
short *nontermmap = XCALLOC (short, nvars) - ntokens; |
short *nontermmap = XCALLOC (short, nvars) - ntokens; |
337 |
n = ntokens; |
n = ntokens; |
371 |
|
|
372 |
for (i = 1; i <= nrules; i++) |
for (i = 1; i <= nrules; i++) |
373 |
{ |
{ |
374 |
/* Ignore the rules disabled above. */ |
rule_table[i].lhs = nontermmap[rule_table[i].lhs]; |
|
if (rule_table[i].lhs >= 0) |
|
|
rule_table[i].lhs = nontermmap[rule_table[i].lhs]; |
|
375 |
if (ISVAR (rule_table[i].precsym)) |
if (ISVAR (rule_table[i].precsym)) |
376 |
/* Can this happen? */ |
/* Can this happen? */ |
377 |
rule_table[i].precsym = nontermmap[rule_table[i].precsym]; |
rule_table[i].precsym = nontermmap[rule_table[i].precsym]; |
386 |
nsyms -= nuseless_nonterminals; |
nsyms -= nuseless_nonterminals; |
387 |
nvars -= nuseless_nonterminals; |
nvars -= nuseless_nonterminals; |
388 |
|
|
389 |
free (&nontermmap[ntokens]); |
free (nontermmap + ntokens); |
390 |
} |
} |
391 |
|
|
392 |
|
|
426 |
int i; |
int i; |
427 |
fprintf (out, "%s\n\n", _("Useless rules:")); |
fprintf (out, "%s\n\n", _("Useless rules:")); |
428 |
for (i = 1; i <= nrules; i++) |
for (i = 1; i <= nrules; i++) |
429 |
if (!BITISSET (P, i)) |
if (!rule_table[i].useful) |
430 |
{ |
{ |
431 |
rule r; |
rule r; |
432 |
fprintf (out, "#%-4d ", i); |
fprintf (out, "#%-4d ", i); |
433 |
fprintf (out, "%s :\t", tags[rule_table[i].lhs]); |
fprintf (out, "%s:", tags[rule_table[i].lhs]); |
434 |
for (r = &ritem[rule_table[i].rhs]; *r >= 0; r++) |
for (r = &ritem[rule_table[i].rhs]; *r >= 0; r++) |
435 |
fprintf (out, " %s", tags[*r]); |
fprintf (out, " %s", tags[*r]); |
436 |
fputs (";\n", out); |
fputs (";\n", out); |