diff options
Diffstat (limited to 'contrib/byacc/closure.c')
-rw-r--r-- | contrib/byacc/closure.c | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/contrib/byacc/closure.c b/contrib/byacc/closure.c index 61848ebf5658..53a81e40d515 100644 --- a/contrib/byacc/closure.c +++ b/contrib/byacc/closure.c @@ -1,4 +1,4 @@ -/* $Id: closure.c,v 1.11 2014/09/18 00:40:07 tom Exp $ */ +/* $Id: closure.c,v 1.14 2022/01/09 16:22:58 tom Exp $ */ #include "defs.h" @@ -6,7 +6,6 @@ Value_t *itemset; Value_t *itemsetend; unsigned *ruleset; -static unsigned *first_base; static unsigned *first_derives; static unsigned *EFF; @@ -21,7 +20,6 @@ set_EFF(void) { unsigned *row; int symbol; - Value_t *sp; int rowsize; int i; int rule; @@ -32,7 +30,7 @@ set_EFF(void) row = EFF; for (i = start_symbol; i < nsyms; i++) { - sp = derives[i]; + Value_t *sp = derives[i]; for (rule = *sp; rule > 0; rule = *++sp) { symbol = ritem[rrhs[rule]]; @@ -56,9 +54,7 @@ void set_first_derives(void) { unsigned *rrow; - unsigned *vrow; int j; - unsigned k; unsigned cword = 0; Value_t *rp; @@ -69,16 +65,16 @@ set_first_derives(void) rulesetsize = WORDSIZE(nrules); varsetsize = WORDSIZE(nvars); - first_base = NEW2(nvars * rulesetsize, unsigned); - first_derives = first_base - ntokens * rulesetsize; + first_derives = NEW2(nvars * rulesetsize, unsigned); set_EFF(); - rrow = first_derives + ntokens * rulesetsize; + rrow = first_derives; for (i = start_symbol; i < nsyms; i++) { - vrow = EFF + ((i - ntokens) * varsetsize); - k = BITS_PER_WORD; + unsigned *vrow = EFF + ((i - ntokens) * varsetsize); + unsigned k = BITS_PER_WORD; + for (j = start_symbol; j < nsyms; k++, j++) { if (k >= BITS_PER_WORD) @@ -87,7 +83,7 @@ set_first_derives(void) k = 0; } - if (cword & (1u << k)) + if (cword & (1U << k)) { rp = derives[j]; while ((rule = *rp++) >= 0) @@ -111,7 +107,6 @@ void closure(Value_t *nucleus, int n) { unsigned ruleno; - unsigned word; unsigned i; Value_t *csp; unsigned *dsp; @@ -120,7 +115,6 @@ closure(Value_t *nucleus, int n) Value_t *csend; unsigned *rsend; - int symbol; Value_t itemno; rulesetsize = WORDSIZE(nrules); @@ -131,10 +125,11 @@ closure(Value_t *nucleus, int n) csend = nucleus + n; for (csp = nucleus; csp < csend; ++csp) { - symbol = ritem[*csp]; + int symbol = ritem[*csp]; + if (ISVAR(symbol)) { - dsp = first_derives + symbol * rulesetsize; + dsp = first_derives + (symbol - ntokens) * rulesetsize; rsp = ruleset; while (rsp < rsend) *rsp++ |= *dsp++; @@ -146,12 +141,13 @@ closure(Value_t *nucleus, int n) csp = nucleus; for (rsp = ruleset; rsp < rsend; ++rsp) { - word = *rsp; + unsigned word = *rsp; + if (word) { for (i = 0; i < BITS_PER_WORD; ++i) { - if (word & (1u << i)) + if (word & (1U << i)) { itemno = rrhs[ruleno + i]; while (csp < csend && *csp < itemno) @@ -178,7 +174,7 @@ finalize_closure(void) { FREE(itemset); FREE(ruleset); - FREE(first_base); + FREE(first_derives); } #ifdef DEBUG @@ -238,7 +234,7 @@ print_first_derives(void) for (i = start_symbol; i < nsyms; i++) { printf("\n%s derives\n", symbol_name[i]); - rp = first_derives + i * WORDSIZE(nrules); + rp = first_derives + (i - ntokens) * WORDSIZE(nrules); k = BITS_PER_WORD; for (j = 0; j <= nrules; k++, j++) { |