* src/closure.c (ruleset): Be a bitset.

(rulesetsize): Remove.
This commit is contained in:
Akim Demaille
2002-03-04 11:59:18 +00:00
parent 7086e7071e
commit dfdb1797c3
2 changed files with 15 additions and 18 deletions

View File

@@ -1,3 +1,9 @@
2002-03-04 Akim Demaille <akim@epita.fr>
* src/closure.c (ruleset): Be a bitset.
(rulesetsize): Remove.
2002-03-04 Akim Demaille <akim@epita.fr> 2002-03-04 Akim Demaille <akim@epita.fr>
* lib/bitset-int.h, lib/bitset.c, lib/bitset.h, lib/bitsetv.c, * lib/bitset-int.h, lib/bitset.c, lib/bitset.h, lib/bitsetv.c,

View File

@@ -32,7 +32,7 @@
short *itemset; short *itemset;
int nitemset; int nitemset;
static unsigned *ruleset; static bitset ruleset;
/* internal data. See comments before set_fderives and set_firsts. */ /* internal data. See comments before set_fderives and set_firsts. */
static bitset *fderives; static bitset *fderives;
@@ -42,9 +42,6 @@ static unsigned int *firsts;
#define FDERIVES(Var) fderives[(Var) - ntokens] #define FDERIVES(Var) fderives[(Var) - ntokens]
#define FIRSTS(Var) (firsts + ((Var) - ntokens) * varsetsize) #define FIRSTS(Var) (firsts + ((Var) - ntokens) * varsetsize)
/* number of words required to hold a bit for each rule */
static int rulesetsize;
/* number of words required to hold a bit for each variable */ /* number of words required to hold a bit for each variable */
static int varsetsize; static int varsetsize;
@@ -188,8 +185,8 @@ new_closure (int n)
{ {
itemset = XCALLOC (short, n); itemset = XCALLOC (short, n);
rulesetsize = WORDSIZE (nrules + 1); ruleset = bitset_create (nrules + 1, BITSET_FIXED);
ruleset = XCALLOC (unsigned, rulesetsize); bitset_zero (ruleset);
set_fderives (); set_fderives ();
} }
@@ -213,28 +210,21 @@ closure (short *core, int n)
if (n == 0) if (n == 0)
{ {
for (ruleno = 0; ruleno < nrules + 1; ++ruleno) bitset_copy (ruleset, FDERIVES (start_symbol));
if (bitset_test (FDERIVES (start_symbol), ruleno))
SETBIT (ruleset, ruleno);
else
RESETBIT (ruleset, ruleno);
} }
else else
{ {
for (r = 0; r < rulesetsize; ++r) bitset_zero (ruleset);
ruleset[r] = 0;
for (c = 0; c < n; ++c) for (c = 0; c < n; ++c)
if (ISVAR (ritem[core[c]])) if (ISVAR (ritem[core[c]]))
for (ruleno = 0; ruleno < nrules + 1; ++ruleno) bitset_or (ruleset, ruleset, FDERIVES (ritem[core[c]]));
if (bitset_test (FDERIVES (ritem[core[c]]), ruleno))
SETBIT (ruleset, ruleno);
} }
nitemset = 0; nitemset = 0;
c = 0; c = 0;
for (ruleno = 0; ruleno < nrules + 1; ++ruleno) for (ruleno = 0; ruleno < nrules + 1; ++ruleno)
if (BITISSET (ruleset, ruleno)) if (bitset_test (ruleset, ruleno))
{ {
int itemno = rules[ruleno].rhs; int itemno = rules[ruleno].rhs;
while (c < n && core[c] < itemno) while (c < n && core[c] < itemno)
@@ -264,7 +254,8 @@ free_closure (void)
{ {
int i; int i;
XFREE (itemset); XFREE (itemset);
XFREE (ruleset);
bitset_free (ruleset);
for (i = 0 ; i < nvars; ++i) for (i = 0 ; i < nvars; ++i)
bitset_free (fderives[i]); bitset_free (fderives[i]);