* 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,40 +71,34 @@ 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)
{
int symbol = rule_table[-(*r++)].lhs;
if (symbol >= 0 && !nullable[symbol])
{
nullable[symbol] = 1;
*s2++ = symbol;
}
}
else
{ {
/* Walk RITEM to find (i), if there are any tokens in the
RHS, and (ii), to find RULENO. */
int ruleno;
int any_tokens = 0; int any_tokens = 0;
int symbol; short *r1;
short *r1 = r; for (r1 = r; *r1 > 0; ++r1)
for (symbol = *r++; symbol > 0; symbol = *r++) if (ISTOKEN (*r1))
if (ISTOKEN (symbol))
any_tokens = 1; any_tokens = 1;
ruleno = -*r1;
/* Examine the RHS of the rule. */
if (!any_tokens) if (!any_tokens)
{ for (/* Nothing. */; *r > 0; ++r)
int ruleno = -symbol;
r = r1;
for (symbol = *r++; symbol > 0; symbol = *r++)
{ {
rcount[ruleno]++; rcount[ruleno]++;
p->next = rsets[symbol]; p->next = rsets[*r];
p->value = ruleno; p->value = ruleno;
rsets[symbol] = p; rsets[*r] = p;
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;
} }
} }