X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/f9abaa2c4c5c77c5b6bdcfc0149c0af5adc8cc39..fba798c78e96bf05252144d2639de4140decde4b:/src/conflicts.c?ds=sidebyside diff --git a/src/conflicts.c b/src/conflicts.c index e08256a1..22e7d8a3 100644 --- a/src/conflicts.c +++ b/src/conflicts.c @@ -1,5 +1,6 @@ /* Find and resolve or report look-ahead conflicts for bison, - Copyright 1984, 1989, 1992, 2000, 2001, 2002 Free Software Foundation, Inc. + Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002 + Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -40,13 +41,15 @@ static bitset lookaheadset; static inline void -log_resolution (state_t *state, int LAno, int token, char *resolution) +log_resolution (state_t *state, int LAno, int token, const char *resolution) { if (verbose_flag) obstack_fgrow4 (&output_obstack, _("\ Conflict in state %d between rule %d and token %s resolved as %s.\n"), - state->number, LAruleno[LAno], symbols[token]->tag, + state->number, + LArule[LAno]->number, + symbols[token]->tag, resolution); } @@ -95,7 +98,7 @@ resolve_sr_conflict (state_t *state, int lookahead) { int i; /* find the rule to reduce by to get precedence of reduction */ - int redprec = rules[LAruleno[lookahead]].prec; + int redprec = LArule[lookahead]->prec->prec; errs *errp = errs_new (ntokens + 1); errp->nerrs = 0; @@ -155,7 +158,7 @@ resolve_sr_conflict (state_t *state, int lookahead) static void set_conflicts (state_t *state) { - int i, j; + int i; shifts *shiftp; if (state->consistent) @@ -172,25 +175,20 @@ set_conflicts (state_t *state) check for shift-reduce conflict, and try to resolve using precedence */ for (i = 0; i < state->nlookaheads; ++i) - if (rules[LAruleno[state->lookaheadsp + i]].prec) - for (j = 0; j < ntokens; ++j) - if (bitset_test (LA[state->lookaheadsp + i], j) - && bitset_test (lookaheadset, j)) - { - resolve_sr_conflict (state, state->lookaheadsp + i); - break; - } - + if (LArule[state->lookaheadsp + i]->prec + && LArule[state->lookaheadsp + i]->prec->prec + && !bitset_disjoint_p (LA[state->lookaheadsp + i], lookaheadset)) + { + resolve_sr_conflict (state, state->lookaheadsp + i); + break; + } /* Loop over all rules which require lookahead in this state. Check for conflicts not resolved above. */ for (i = 0; i < state->nlookaheads; ++i) { - /* FIXME: Here, I need something like `bitset_disjoint_p'. */ - for (j = 0; j < ntokens; ++j) - if (bitset_test (LA[state->lookaheadsp + i], j) - && bitset_test (lookaheadset, j)) - conflicts[state->number] = 1; + if (!bitset_disjoint_p (LA[state->lookaheadsp + i], lookaheadset)) + conflicts[state->number] = 1; bitset_or (lookaheadset, lookaheadset, LA[state->lookaheadsp + i]); } @@ -203,9 +201,7 @@ solve_conflicts (void) conflicts = XCALLOC (char, nstates); shiftset = bitset_create (ntokens, BITSET_FIXED); - bitset_zero (shiftset); lookaheadset = bitset_create (ntokens, BITSET_FIXED); - bitset_zero (lookaheadset); for (i = 0; i < nstates; i++) set_conflicts (states[i]); @@ -238,9 +234,7 @@ count_sr_conflicts (state_t *state) bitset_and (lookaheadset, lookaheadset, shiftset); - for (i = 0; i < ntokens; i++) - if (bitset_test (lookaheadset, i)) - src_count++; + src_count = bitset_count (lookaheadset); return src_count; }