From: Akim Demaille Date: Wed, 5 Dec 2001 09:27:08 +0000 (+0000) Subject: * src/nullable.c (set_nullable): Deobfuscate the handling of X-Git-Tag: before-m4-back-end~215 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/81b51460c9ebe2d145e3bc39145621107d23ff35 * src/nullable.c (set_nullable): Deobfuscate the handling of ritem. `symbol >= 0' is wrong now, use `rule_table[ruleno].useful'. --- diff --git a/ChangeLog b/ChangeLog index 1a82f438..6cd76086 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2001-12-05 Akim Demaille + + * 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 * src/gram.c, src/gram.h (ritem_print): New. diff --git a/src/nullable.c b/src/nullable.c index c207924d..74164937 100644 --- a/src/nullable.c +++ b/src/nullable.c @@ -71,41 +71,35 @@ set_nullable (void) relts = XCALLOC (shorts, nitems + nvars + 1); p = relts; - r = ritem; - while (*r) + for (r = ritem; *r; ++r) { - if (*r < 0) + /* Walk RITEM to find (i), if there are any tokens in the + RHS, and (ii), to find RULENO. */ + int ruleno; + int any_tokens = 0; + short *r1; + for (r1 = r; *r1 > 0; ++r1) + if (ISTOKEN (*r1)) + any_tokens = 1; + ruleno = -*r1; + + /* Examine the RHS of the rule. */ + if (!any_tokens) + for (/* Nothing. */; *r > 0; ++r) + { + rcount[ruleno]++; + p->next = rsets[*r]; + p->value = ruleno; + rsets[*r] = p; + p++; + } + + /* Examine its LHS. */ + if (rule_table[ruleno].useful && !nullable[rule_table[ruleno].lhs]) { - int symbol = rule_table[-(*r++)].lhs; - if (symbol >= 0 && !nullable[symbol]) - { - nullable[symbol] = 1; - *s2++ = symbol; - } - } - 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) - { - int ruleno = -symbol; - r = r1; - for (symbol = *r++; symbol > 0; symbol = *r++) - { - rcount[ruleno]++; - p->next = rsets[symbol]; - p->value = ruleno; - rsets[symbol] = p; - p++; - } - } - } + nullable[rule_table[ruleno].lhs] = 1; + *s2++ = rule_table[ruleno].lhs; + } } while (s1 < s2)