X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/be7280480c175bed203883f524c7dcd6cf37c13d..4f16766c00b107bf12328bc6a613535bd7af8275:/src/conflicts.c diff --git a/src/conflicts.c b/src/conflicts.c index 721627f2..2edd1e8b 100644 --- a/src/conflicts.c +++ b/src/conflicts.c @@ -1,6 +1,6 @@ /* Find and resolve or report look-ahead conflicts for bison, - Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002 + Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -36,7 +36,8 @@ #include "symtab.h" /* -1 stands for not specified. */ -int expected_conflicts = -1; +int expected_sr_conflicts = -1; +int expected_rr_conflicts = -1; static char *conflicts = NULL; struct obstack solved_conflicts_obstack; @@ -237,9 +238,12 @@ resolve_sr_conflict (state *s, int ruleno, symbol **errors) } } - /* 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 (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)) { @@ -277,10 +281,7 @@ set_conflicts (state *s, symbol **errors) for (i = 0; i < reds->num; ++i) if (reds->rules[i]->prec && reds->rules[i]->prec->prec && !bitset_disjoint_p (reds->lookaheads[i], lookaheadset)) - { - resolve_sr_conflict (s, i, errors); - break; - } + resolve_sr_conflict (s, i, errors); /* Loop over all rules which require lookahead in this state. Check for conflicts not resolved above. */ @@ -365,7 +366,7 @@ count_sr_conflicts (state *s) +`----------------------------------------------------------------*/ static int -count_rr_conflicts (state *s, int one_per_token) +count_rr_conflicts (state *s, bool one_per_token) { int i; reductions *reds = s->reductions; @@ -463,7 +464,8 @@ conflicts_print (void) /* Is the number of SR conflicts OK? Either EXPECTED_CONFLICTS is not set, and then we want 0 SR, or else it is specified, in which case we want equality. */ - int src_ok = 0; + bool src_ok = false; + bool rrc_ok = false; int src_total = 0; int rrc_total = 0; @@ -480,11 +482,20 @@ conflicts_print (void) } } - src_ok = src_total == (expected_conflicts == -1 ? 0 : expected_conflicts); + if (! glr_parser && rrc_total > 0 && expected_rr_conflicts != -1) + { + warn (_("%%expect-rr applies only to GLR parsers")); + expected_rr_conflicts = -1; + } + + src_ok = + src_total == (expected_sr_conflicts == -1 ? 0 : expected_sr_conflicts); + rrc_ok = + rrc_total == (expected_rr_conflicts == -1 ? 0 : expected_rr_conflicts); - /* If there are no RR conflicts, and as many SR conflicts as + /* If there are as many RR conflicts and SR conflicts as expected, then there is nothing to report. */ - if (!rrc_total && src_ok) + if (rrc_ok && src_ok) return; /* Report the total number of conflicts on STDERR. */ @@ -492,15 +503,18 @@ conflicts_print (void) fprintf (stderr, "%s: ", current_file); conflict_report (stderr, src_total, rrc_total); - if (expected_conflicts != -1) + if (expected_sr_conflicts != -1 || expected_rr_conflicts != -1) { + int sr = expected_sr_conflicts == -1 ? 0 : expected_sr_conflicts; + int rr = expected_rr_conflicts == -1 ? 0 : expected_rr_conflicts; if (! src_ok) - complain (ngettext ("expected %d shift/reduce conflict", - "expected %d shift/reduce conflicts", - expected_conflicts), - expected_conflicts); - if (rrc_total) - complain (_("expected 0 reduce/reduce conflicts")); + warn (ngettext ("expected %d shift/reduce conflict", + "expected %d shift/reduce conflicts", + sr), sr); + if (! rrc_ok) + warn (ngettext ("expected %d reduce/reduce conflict", + "expected %d reduce/reduce conflicts", + rr), rr); } }