mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-15 15:23:02 +00:00
* src/closure.c (closure): r' and c' are new variables, used to
de-obfuscate accesses to RULESET and CORE.
This commit is contained in:
@@ -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.
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user