* src/closure.c (closure): r' and c' are new variables, used to

de-obfuscate accesses to RULESET and CORE.
This commit is contained in:
Akim Demaille
2001-11-28 14:55:38 +00:00
parent 457b6d1e72
commit 2ce6476804
2 changed files with 41 additions and 29 deletions

View File

@@ -1,5 +1,12 @@
2001-11-28 Akim Demaille <akim@epita.fr> 2001-11-28 Akim Demaille <akim@epita.fr>
* src/closure.c (closure): `r' and `c' are new variables, used to
de-obfuscate accesses to RULESET and CORE.
2001-11-28 Akim Demaille <akim@epita.fr>
* tests/reduce.at (Useless Nonterminals):
* src/reduce.c (reduce_print): Use ngettext. * src/reduce.c (reduce_print): Use ngettext.
(dump_grammar): Improve the trace accuracy. (dump_grammar): Improve the trace accuracy.

View File

@@ -236,48 +236,44 @@ void
closure (short *core, int n) closure (short *core, int n)
{ {
int ruleno; int ruleno;
short *csp; /* Index over CORE. */
int c;
/* Index over RULESET. */
int r;
int itemno; int itemno;
int i;
if (trace_flag) if (trace_flag)
{ {
fprintf (stderr, "Entering closure (items = {"); fprintf (stderr, "Entering closure (items = {");
for (i = 0; i < n; ++i) for (c = 0; c < n; ++c)
fprintf (stderr, " %d ", core[i]); fprintf (stderr, " %d ", core[c]);
fprintf (stderr, "}, nitems = %d)\n", n); fprintf (stderr, "})\n");
} }
if (n == 0) if (n == 0)
{ {
for (i = 0; i < rulesetsize; ++i) for (r = 0; r < rulesetsize; ++r)
ruleset[i] = FDERIVES (start_symbol)[i]; ruleset[r] = FDERIVES (start_symbol)[r];
} }
else else
{ {
for (i = 0; i < rulesetsize; ++i) for (r = 0; r < rulesetsize; ++r)
ruleset[i] = 0; ruleset[r] = 0;
for (i = 0; i < n; ++i) for (c = 0; c < n; ++c)
{ if (ISVAR (ritem[core[c]]))
int symbol = ritem[core[i]]; for (r = 0; r < rulesetsize; ++r)
if (ISVAR (symbol)) ruleset[r] |= FDERIVES (ritem[core[c]])[r];
{
int j;
for (j = 0; j < rulesetsize; ++j)
ruleset[j] |= FDERIVES (symbol)[j];
}
}
} }
ruleno = 0; ruleno = 0;
itemsetsize = 0; itemsetsize = 0;
csp = core; c = 0;
for (i = 0; i < rulesetsize; ++i) for (r = 0; r < rulesetsize; ++r)
{ {
int word = ruleset[i]; if (ruleset[r] == 0)
if (word == 0)
{ {
ruleno += BITS_PER_WORD; ruleno += BITS_PER_WORD;
} }
@@ -287,12 +283,17 @@ closure (short *core, int n)
for (b = 0; b < BITS_PER_WORD; b++) for (b = 0; b < BITS_PER_WORD; b++)
{ {
if (word & (1 << b)) if (ruleset[r] & (1 << b))
{ {
itemno = rule_table[ruleno].rhs; itemno = rule_table[ruleno].rhs;
while (csp < (core + n) && *csp < itemno) while (c < n && core[c] < itemno)
itemset[itemsetsize++] = *csp++; {
itemset[itemsetsize++] = itemno; itemset[itemsetsize] = core[c];
itemsetsize++;
c++;
}
itemset[itemsetsize] = itemno;
itemsetsize++;
} }
ruleno++; ruleno++;
@@ -300,8 +301,12 @@ closure (short *core, int n)
} }
} }
while (csp < (core + n)) while (c < n)
itemset[itemsetsize++] = *csp++; {
itemset[itemsetsize] = core[c];
itemsetsize++;
c++;
}
if (trace_flag) if (trace_flag)
print_closure (n); print_closure (n);