- if (n == 0)
- {
- for (i = 0; i < rulesetsize; ++i)
- ruleset[i] = FDERIVES (start_symbol)[i];
- }
- else
- {
- for (i = 0; i < rulesetsize; ++i)
- ruleset[i] = 0;
-
- for (i = 0; i < n; ++i)
- {
- int symbol = ritem[core[i]];
- if (ISVAR (symbol))
- {
- int j;
- for (j = 0; j < rulesetsize; ++j)
- ruleset[j] |= FDERIVES (symbol)[j];
- }
- }
- }
-
- ruleno = 0;
- itemsetend = itemset;
- csp = core;
- for (i= 0; i < rulesetsize; ++i)
- {
- int word = ruleset[i];
- if (word == 0)
- {
- ruleno += BITS_PER_WORD;
- }
- else
- {
- int b;
-
- for (b = 0; b < BITS_PER_WORD; b++)
- {
- if (word & (1 << b))
- {
- itemno = rule_table[ruleno].rhs;
- while (csp < (core + n ) && *csp < itemno)
- *itemsetend++ = *csp++;
- *itemsetend++ = itemno;
- }
-
- ruleno++;
- }
- }
- }
-
- while (csp < (core + n))
- *itemsetend++ = *csp++;
-