72 |
/* A production is useful if all of the nonterminals in its appear |
/* A production is useful if all of the nonterminals in its appear |
73 |
in the set of useful nonterminals. */ |
in the set of useful nonterminals. */ |
74 |
|
|
75 |
for (r = &ritem[rules[i].rhs]; *r >= 0; r++) |
for (r = rules[i].rhs; *r >= 0; r++) |
76 |
if (ISVAR (n = *r) && !bitset_test (N0, n - ntokens)) |
if (ISVAR (n = *r) && !bitset_test (N0, n - ntokens)) |
77 |
return FALSE; |
return FALSE; |
78 |
return TRUE; |
return TRUE; |
180 |
&& bitset_test (P, i) |
&& bitset_test (P, i) |
181 |
&& bitset_test (V, rules[i].lhs)) |
&& bitset_test (V, rules[i].lhs)) |
182 |
{ |
{ |
183 |
for (r = &ritem[rules[i].rhs]; *r >= 0; r++) |
for (r = rules[i].rhs; *r >= 0; r++) |
184 |
if (ISTOKEN (t = *r) || bitset_test (N, t - ntokens)) |
if (ISTOKEN (t = *r) || bitset_test (N, t - ntokens)) |
185 |
bitset_set (Vp, t); |
bitset_set (Vp, t); |
186 |
bitset_set (Pp, i); |
bitset_set (Pp, i); |
252 |
rules[np].prec = rules[pn].prec; |
rules[np].prec = rules[pn].prec; |
253 |
rules[np].assoc = rules[pn].assoc; |
rules[np].assoc = rules[pn].assoc; |
254 |
rules[np].rhs = rules[pn].rhs; |
rules[np].rhs = rules[pn].rhs; |
255 |
if (rules[np].rhs != ni) |
if (rules[np].rhs - ritem != ni) |
256 |
{ |
{ |
257 |
pi = rules[np].rhs; |
pi = rules[np].rhs - ritem; |
258 |
rules[np].rhs = ni; |
rules[np].rhs = ritem + ni; |
259 |
while (ritem[pi] >= 0) |
while (ritem[pi] >= 0) |
260 |
ritem[ni++] = ritem[pi++]; |
ritem[ni++] = ritem[pi++]; |
261 |
ritem[ni++] = -np; |
ritem[ni++] = -np; |
384 |
rule r; |
rule r; |
385 |
fprintf (out, "#%-4d ", i - 1); |
fprintf (out, "#%-4d ", i - 1); |
386 |
fprintf (out, "%s:", symbols[rules[i].lhs]->tag); |
fprintf (out, "%s:", symbols[rules[i].lhs]->tag); |
387 |
for (r = &ritem[rules[i].rhs]; *r >= 0; r++) |
for (r = rules[i].rhs; *r >= 0; r++) |
388 |
fprintf (out, " %s", symbols[*r]->tag); |
fprintf (out, " %s", symbols[*r]->tag); |
389 |
fputs (";\n", out); |
fputs (";\n", out); |
390 |
} |
} |
415 |
{ |
{ |
416 |
int rhs_count = 0; |
int rhs_count = 0; |
417 |
/* Find the last RHS index in ritems. */ |
/* Find the last RHS index in ritems. */ |
418 |
for (r = &ritem[rules[i].rhs]; *r >= 0; ++r) |
for (r = rules[i].rhs; *r >= 0; ++r) |
419 |
++rhs_count; |
++rhs_count; |
420 |
fprintf (out, "%3d (%2d, %2d, %2d, %2d-%2d) %2d ->", |
fprintf (out, "%3d (%2d, %2d, %2d, %2d-%2d) %2d ->", |
421 |
i - 1, |
i - 1, |
422 |
rules[i].prec, rules[i].assoc, rules[i].useful, |
rules[i].prec, rules[i].assoc, rules[i].useful, |
423 |
rules[i].rhs, rules[i].rhs + rhs_count - 1, |
rules[i].rhs - ritem, rules[i].rhs - ritem + rhs_count - 1, |
424 |
rules[i].lhs); |
rules[i].lhs); |
425 |
/* Dumped the RHS. */ |
/* Dumped the RHS. */ |
426 |
for (r = &ritem[rules[i].rhs]; *r >= 0; r++) |
for (r = rules[i].rhs; *r >= 0; r++) |
427 |
fprintf (out, "%3d", *r); |
fprintf (out, "%3d", *r); |
428 |
fprintf (out, " [%d]\n", -(*r) - 1); |
fprintf (out, " [%d]\n", -(*r) - 1); |
429 |
} |
} |
432 |
for (i = 1; i <= nrules; i++) |
for (i = 1; i <= nrules; i++) |
433 |
{ |
{ |
434 |
fprintf (out, "%-5d %s :", i, symbols[rules[i].lhs]->tag); |
fprintf (out, "%-5d %s :", i, symbols[rules[i].lhs]->tag); |
435 |
for (r = &ritem[rules[i].rhs]; *r >= 0; r++) |
for (r = rules[i].rhs; *r >= 0; r++) |
436 |
fprintf (out, " %s", symbols[*r]->tag); |
fprintf (out, " %s", symbols[*r]->tag); |
437 |
fputc ('\n', out); |
fputc ('\n', out); |
438 |
} |
} |
490 |
inaccessable_symbols (); |
inaccessable_symbols (); |
491 |
|
|
492 |
reduced = (bool) (nuseless_nonterminals + nuseless_productions > 0); |
reduced = (bool) (nuseless_nonterminals + nuseless_productions > 0); |
|
|
|
493 |
if (!reduced) |
if (!reduced) |
494 |
return; |
return; |
495 |
|
|