/* Find and resolve or report lookahead conflicts for bison,
- Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
+ Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
/*------------------------------------------------------------------.
| Turn off the shift recorded for the specified token in the |
| specified state. Used when we resolve a shift-reduce conflict in |
-| favor of the reduction. |
+| favor of the reduction or as an error (%nonassoc). |
`------------------------------------------------------------------*/
static void
/*--------------------------------------------------------------------.
-| Turn off the reduce recorded for the specified token for the |
-| specified lookahead. Used when we resolve a shift-reduce conflict |
-| in favor of the shift. |
+| Turn off the reduce recorded for the specified token in the |
+| specified lookahead set. Used when we resolve a shift-reduce |
+| conflict in favor of the shift or as an error (%nonassoc). |
`--------------------------------------------------------------------*/
static void
| |
| RULENO is the number of the lookahead bitset to consider. |
| |
-| ERRORS can be used to store discovered explicit errors. |
+| ERRORS and NERRS can be used to store discovered explicit |
+| errors. |
`------------------------------------------------------------------*/
static void
-resolve_sr_conflict (state *s, int ruleno, symbol **errors)
+resolve_sr_conflict (state *s, int ruleno, symbol **errors, int *nerrs)
{
symbol_number i;
reductions *reds = s->reductions;
rule *redrule = reds->rules[ruleno];
int redprec = redrule->prec->prec;
bitset lookahead_tokens = reds->lookahead_tokens[ruleno];
- int nerrs = 0;
for (i = 0; i < ntokens; i++)
if (bitset_test (lookahead_tokens, i)
flush_shift (s, i);
flush_reduce (lookahead_tokens, i);
/* Record an explicit error for this token. */
- errors[nerrs++] = symbols[i];
+ errors[(*nerrs)++] = symbols[i];
break;
}
}
-
- if (nerrs)
- {
- /* Some tokens have been explicitly made errors. Allocate a
- permanent errs structure for this state, to record them. */
- state_errs_set (s, nerrs, errors);
- }
-
- if (obstack_object_size (&solved_conflicts_obstack))
- {
- obstack_1grow (&solved_conflicts_obstack, '\0');
- s->solved_conflicts = obstack_finish (&solved_conflicts_obstack);
- }
}
int i;
transitions *trans = s->transitions;
reductions *reds = s->reductions;
+ int nerrs = 0;
if (s->consistent)
return;
for (i = 0; i < reds->num; ++i)
if (reds->rules[i]->prec && reds->rules[i]->prec->prec
&& !bitset_disjoint_p (reds->lookahead_tokens[i], lookahead_set))
- resolve_sr_conflict (s, i, errors);
+ resolve_sr_conflict (s, i, errors, &nerrs);
+
+ if (nerrs)
+ {
+ /* Some tokens have been explicitly made errors. Allocate a
+ permanent errs structure for this state, to record them. */
+ state_errs_set (s, nerrs, errors);
+ }
+ if (obstack_object_size (&solved_conflicts_obstack))
+ {
+ obstack_1grow (&solved_conflicts_obstack, '\0');
+ s->solved_conflicts = obstack_finish (&solved_conflicts_obstack);
+ }
/* Loop over all rules which require lookahead in this state. Check
for conflicts not resolved above. */
{
if (!bitset_disjoint_p (reds->lookahead_tokens[i], lookahead_set))
conflicts[s->number] = 1;
-
bitset_or (lookahead_set, lookahead_set, reds->lookahead_tokens[i]);
}
}
conflicts_update_state_numbers (state_number old_to_new[],
state_number nstates_old)
{
- for (state_number i = 0; i < nstates_old; ++i)
+ state_number i;
+ for (i = 0; i < nstates_old; ++i)
if (old_to_new[i] != nstates_old)
conflicts[old_to_new[i]] = conflicts[i];
}