X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/f041e30b91baed171ee7423d89f5bf4361e32777..0ced3098fd97e1483b4ac938bdce99bfc7942539:/src/conflicts.c diff --git a/src/conflicts.c b/src/conflicts.c index 57d42d01..44546e1c 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 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -237,9 +237,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 +280,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. */ @@ -304,9 +304,9 @@ conflicts_solve (void) { state_number i; /* List of lookaheads on which we explicitly raise a syntax error. */ - symbol **errors = XMALLOC (symbol *, ntokens + 1); + symbol **errors = MALLOC (errors, ntokens + 1); - conflicts = XCALLOC (char, nstates); + CALLOC (conflicts, nstates); shiftset = bitset_create (ntokens, BITSET_FIXED); lookaheadset = bitset_create (ntokens, BITSET_FIXED); obstack_init (&solved_conflicts_obstack); @@ -365,7 +365,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; @@ -387,60 +387,20 @@ count_rr_conflicts (state *s, int one_per_token) } -/*--------------------------------------------------------------. -| Return a human readable string which reports shift/reduce and | -| reduce/reduce conflict numbers (SRC_NUM, RRC_NUM). | -`--------------------------------------------------------------*/ - -static const char * -conflict_report (int src_num, int rrc_num) -{ - static char res[4096]; - char *cp = res; - - if (src_num >= 1) - { - sprintf (cp, ngettext ("%d shift/reduce conflict", - "%d shift/reduce conflicts", src_num), src_num); - cp += strlen (cp); - } - - if (src_num > 0 && rrc_num > 0) - { - sprintf (cp, " %s ", _("and")); - cp += strlen (cp); - } - - if (rrc_num >= 1) - { - sprintf (cp, ngettext ("%d reduce/reduce conflict", - "%d reduce/reduce conflicts", rrc_num), rrc_num); - cp += strlen (cp); - } - - *cp++ = '\0'; - - return res; -} - - -/*----------------------------------------------------------------. -| Same as above, but report the number of conflicts a` la POSIX. | -`----------------------------------------------------------------*/ +/*--------------------------------------------------------. +| Report the number of conflicts, using the Yacc format. | +`--------------------------------------------------------*/ static void -conflict_report_yacc (int src_num, int rrc_num) +conflict_report (FILE *out, int src_num, int rrc_num) { - /* If invoked with `--yacc', use the output format specified by - POSIX. */ - fprintf (stderr, _("conflicts: ")); - if (src_num > 0) - fprintf (stderr, _(" %d shift/reduce"), src_num); - if (src_num > 0 && rrc_num > 0) - fprintf (stderr, ","); - if (rrc_num > 0) - fprintf (stderr, _(" %d reduce/reduce"), rrc_num); - putc ('\n', stderr); + if (src_num && rrc_num) + fprintf (out, _("conflicts: %d shift/reduce, %d reduce/reduce\n"), + src_num, rrc_num); + else if (src_num) + fprintf (out, _("conflicts: %d shift/reduce\n"), src_num); + else if (rrc_num) + fprintf (out, _("conflicts: %d reduce/reduce\n"), rrc_num); } @@ -458,10 +418,9 @@ conflicts_output (FILE *out) state *s = states[i]; if (conflicts[i]) { - fprintf (out, _("State %d contains "), i); - fprintf (out, "%s.\n", - conflict_report (count_sr_conflicts (s), - count_rr_conflicts (s, true))); + fprintf (out, _("State %d "), i); + conflict_report (out, count_sr_conflicts (s), + count_rr_conflicts (s, true)); printed_sth = true; } } @@ -504,7 +463,7 @@ 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; int src_total = 0; int rrc_total = 0; @@ -529,16 +488,20 @@ conflicts_print (void) return; /* Report the total number of conflicts on STDERR. */ - if (yacc_flag) - conflict_report_yacc (src_total, rrc_total); - else - warn ("%s", conflict_report (src_total, rrc_total)); + if (! yacc_flag) + fprintf (stderr, "%s: ", current_file); + conflict_report (stderr, src_total, rrc_total); - if (expected_conflicts != -1 && !src_ok) - complain (ngettext ("expected %d shift/reduce conflict", + if (expected_conflicts != -1) + { + if (! src_ok) + warn (ngettext ("expected %d shift/reduce conflict", "expected %d shift/reduce conflicts", expected_conflicts), expected_conflicts); + if (rrc_total) + warn (_("expected 0 reduce/reduce conflicts")); + } }