mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-12 05:43:03 +00:00
Instead of attaching lookaheads and duplicating the rules being
reduced by a state, attach the lookaheads to the reductions. * src/state.h (state_t): Remove the `lookaheads', `lookaheads_rule' member. (reductions_t): Add a `lookaheads' member. Use a regular array for the `rules'. * src/state.c (reductions_new): Initialize the lookaheads member to 0. (state_rule_lookaheads_print): Adjust. * src/state.h, src/state.c (state_reductions_find): New. * src/conflicts.c (resolve_sr_conflict, set_conflicts) (count_rr_conflicts): Adjust. * src/lalr.c (LArule): Remove. (add_lookback_edge): Adjust. (state_lookaheads_count): New. (states_lookaheads_initialize): Merge into... (initialize_LA): this. (lalr_free): Adjust. * src/main.c (main): Don't free nullable and derives too early: it is used by --verbose. * src/print.c, src/print_graph.c, src/tables.c: Adjust.
This commit is contained in:
101
src/print.c
101
src/print.c
@@ -244,25 +244,25 @@ state_default_rule (state_t *state)
|
||||
bitset_set (shiftset, errp->symbols[i]->number);
|
||||
}
|
||||
|
||||
for (i = 0; i < state->nlookaheads; ++i)
|
||||
for (i = 0; i < redp->num; ++i)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
/* How many non-masked lookaheads are there for this reduction?
|
||||
*/
|
||||
bitset_andn (lookaheadset, state->lookaheads[i], shiftset);
|
||||
bitset_andn (lookaheadset, redp->lookaheads[i], shiftset);
|
||||
count = bitset_count (lookaheadset);
|
||||
|
||||
if (count > cmax)
|
||||
{
|
||||
cmax = count;
|
||||
default_rule = state->lookaheads_rule[i];
|
||||
default_rule = redp->rules[i];
|
||||
}
|
||||
|
||||
/* 3. And finally, each reduction is possibly masked by previous
|
||||
reductions (in R/R conflicts, we keep the first reductions).
|
||||
*/
|
||||
bitset_or (shiftset, shiftset, state->lookaheads[i]);
|
||||
bitset_or (shiftset, shiftset, redp->lookaheads[i]);
|
||||
}
|
||||
|
||||
return default_rule;
|
||||
@@ -322,25 +322,27 @@ print_reductions (FILE *out, state_t *state)
|
||||
/* Compute the width of the lookaheads column. */
|
||||
if (default_rule)
|
||||
width = strlen (_("$default"));
|
||||
for (i = 0; i < ntokens; i++)
|
||||
{
|
||||
int count = bitset_test (shiftset, i);
|
||||
|
||||
for (j = 0; j < state->nlookaheads; ++j)
|
||||
if (bitset_test (state->lookaheads[j], i))
|
||||
{
|
||||
if (count == 0)
|
||||
{
|
||||
if (state->lookaheads_rule[j] != default_rule)
|
||||
if (redp->lookaheads)
|
||||
for (i = 0; i < ntokens; i++)
|
||||
{
|
||||
int count = bitset_test (shiftset, i);
|
||||
|
||||
for (j = 0; j < redp->num; ++j)
|
||||
if (bitset_test (redp->lookaheads[j], i))
|
||||
{
|
||||
if (count == 0)
|
||||
{
|
||||
if (redp->rules[j] != default_rule)
|
||||
max_length (&width, symbols[i]->tag);
|
||||
count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
max_length (&width, symbols[i]->tag);
|
||||
count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
max_length (&width, symbols[i]->tag);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Nothing to report. */
|
||||
if (!width)
|
||||
@@ -350,37 +352,38 @@ print_reductions (FILE *out, state_t *state)
|
||||
width += 2;
|
||||
|
||||
/* Report lookaheads (or $default) and reductions. */
|
||||
for (i = 0; i < ntokens; i++)
|
||||
{
|
||||
int defaulted = 0;
|
||||
int count = bitset_test (shiftset, i);
|
||||
if (redp->lookaheads)
|
||||
for (i = 0; i < ntokens; i++)
|
||||
{
|
||||
int defaulted = 0;
|
||||
int count = bitset_test (shiftset, i);
|
||||
|
||||
for (j = 0; j < state->nlookaheads; ++j)
|
||||
if (bitset_test (state->lookaheads[j], i))
|
||||
{
|
||||
if (count == 0)
|
||||
{
|
||||
if (state->lookaheads_rule[j] != default_rule)
|
||||
for (j = 0; j < redp->num; ++j)
|
||||
if (bitset_test (redp->lookaheads[j], i))
|
||||
{
|
||||
if (count == 0)
|
||||
{
|
||||
if (redp->rules[j] != default_rule)
|
||||
print_reduction (out, width,
|
||||
symbols[i]->tag,
|
||||
redp->rules[j], TRUE);
|
||||
else
|
||||
defaulted = 1;
|
||||
count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (defaulted)
|
||||
print_reduction (out, width,
|
||||
symbols[i]->tag,
|
||||
default_rule, TRUE);
|
||||
defaulted = 0;
|
||||
print_reduction (out, width,
|
||||
symbols[i]->tag,
|
||||
state->lookaheads_rule[j], TRUE);
|
||||
else
|
||||
defaulted = 1;
|
||||
count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (defaulted)
|
||||
print_reduction (out, width,
|
||||
symbols[i]->tag,
|
||||
default_rule, TRUE);
|
||||
defaulted = 0;
|
||||
print_reduction (out, width,
|
||||
symbols[i]->tag,
|
||||
state->lookaheads_rule[j], FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
redp->rules[j], FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (default_rule)
|
||||
print_reduction (out, width,
|
||||
|
||||
Reference in New Issue
Block a user