* src/nullable.c (set_nullable): Deobfuscate the handling of

ritem.
`symbol >= 0' is wrong now, use `rule_table[ruleno].useful'.
This commit is contained in:
Akim Demaille
2001-12-05 09:16:22 +00:00
parent 2dfb4daf9b
commit d854cc9e5a
2 changed files with 34 additions and 33 deletions

View File

@@ -1,3 +1,10 @@
2001-12-05 Akim Demaille <akim@epita.fr>
* src/nullable.c (set_nullable): Deobfuscate the handling of
ritem.
`symbol >= 0' is wrong now, use `rule_table[ruleno].useful'.
2001-12-05 Akim Demaille <akim@epita.fr> 2001-12-05 Akim Demaille <akim@epita.fr>
* src/gram.c, src/gram.h (ritem_print): New. * src/gram.c, src/gram.h (ritem_print): New.

View File

@@ -71,41 +71,35 @@ set_nullable (void)
relts = XCALLOC (shorts, nitems + nvars + 1); relts = XCALLOC (shorts, nitems + nvars + 1);
p = relts; p = relts;
r = ritem; for (r = ritem; *r; ++r)
while (*r)
{ {
if (*r < 0) /* Walk RITEM to find (i), if there are any tokens in the
{ RHS, and (ii), to find RULENO. */
int symbol = rule_table[-(*r++)].lhs; int ruleno;
if (symbol >= 0 && !nullable[symbol]) int any_tokens = 0;
{ short *r1;
nullable[symbol] = 1; for (r1 = r; *r1 > 0; ++r1)
*s2++ = symbol; if (ISTOKEN (*r1))
} any_tokens = 1;
} ruleno = -*r1;
else
{
int any_tokens = 0;
int symbol;
short *r1 = r;
for (symbol = *r++; symbol > 0; symbol = *r++)
if (ISTOKEN (symbol))
any_tokens = 1;
if (!any_tokens) /* Examine the RHS of the rule. */
{ if (!any_tokens)
int ruleno = -symbol; for (/* Nothing. */; *r > 0; ++r)
r = r1; {
for (symbol = *r++; symbol > 0; symbol = *r++) rcount[ruleno]++;
{ p->next = rsets[*r];
rcount[ruleno]++; p->value = ruleno;
p->next = rsets[symbol]; rsets[*r] = p;
p->value = ruleno; p++;
rsets[symbol] = p; }
p++;
} /* Examine its LHS. */
} if (rule_table[ruleno].useful && !nullable[rule_table[ruleno].lhs])
} {
nullable[rule_table[ruleno].lhs] = 1;
*s2++ = rule_table[ruleno].lhs;
}
} }
while (s1 < s2) while (s1 < s2)