X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/d7913476c462b480f11e14b6829942f2691c6c01..e795bd73766b33f46ba1c54dec84654e6afcc59d:/src/conflicts.c diff --git a/src/conflicts.c b/src/conflicts.c index 0b948480..208f7910 100644 --- a/src/conflicts.c +++ b/src/conflicts.c @@ -1,5 +1,5 @@ /* Find and resolve or report look-ahead conflicts for bison, - Copyright (C) 1984, 1989, 1992, 2000 Free Software Foundation, Inc. + Copyright 1984, 1989, 1992, 2000, 2001 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -45,11 +45,10 @@ static int rrc_count; static inline void log_resolution (int state, int LAno, int token, char *resolution) { - if (verboseflag) - fprintf (foutput, - _("\ + obstack_fgrow4 (&output_obstack, + _("\ Conflict in state %d between rule %d and token %s resolved as %s.\n"), - state, LAruleno[LAno], tags[token], resolution); + state, LAruleno[LAno], tags[token], resolution); } @@ -131,29 +130,29 @@ resolve_sr_conflict (int state, int lookaheadnum) switch (sassoc[i]) { - case RIGHT_ASSOC: + case right_assoc: log_resolution (state, lookaheadnum, i, _("shift")); break; - case LEFT_ASSOC: + case left_assoc: log_resolution (state, lookaheadnum, i, _("reduce")); break; - case NON_ASSOC: + case non_assoc: log_resolution (state, lookaheadnum, i, _("an error")); break; } - if (sassoc[i] != RIGHT_ASSOC) + if (sassoc[i] != right_assoc) { *fp2 &= ~mask; /* flush the shift for this token */ flush_shift (state, i); } - if (sassoc[i] != LEFT_ASSOC) + if (sassoc[i] != left_assoc) { *fp1 &= ~mask; /* flush the reduce for this token */ } - if (sassoc[i] == NON_ASSOC) + if (sassoc[i] == non_assoc) { /* Record an explicit error for this token. */ *errtokens++ = i; @@ -407,29 +406,50 @@ count_rr_conflicts (int state) } } -/*----------------------------------------------------------. -| Output to OUT a human readable report on shift/reduce and | -| reduce/reduce conflict numbers (SRC_NUM, RRC_NUM). | -`----------------------------------------------------------*/ +/*--------------------------------------------------------------. +| Return a human readable string which reports shift/reduce and | +| reduce/reduce conflict numbers (SRC_NUM, RRC_NUM). | +`--------------------------------------------------------------*/ -static void -conflict_report (FILE *out, int src_num, int rrc_num) +static const char * +conflict_report (int src_num, int rrc_num) { + static char res[4096]; + char *cp = res; + if (src_num == 1) - fprintf (out, _(" 1 shift/reduce conflict")); + { + sprintf (cp, _(" 1 shift/reduce conflict")); + cp += strlen (cp); + } else if (src_num > 1) - fprintf (out, _(" %d shift/reduce conflicts"), src_num); + { + sprintf (cp, _(" %d shift/reduce conflicts"), src_num); + cp += strlen (cp); + } if (src_num > 0 && rrc_num > 0) - fprintf (out, _(" and")); + { + sprintf (cp, _(" and")); + cp += strlen (cp); + } if (rrc_num == 1) - fprintf (out, _(" 1 reduce/reduce conflict")); + { + sprintf (cp, _(" 1 reduce/reduce conflict")); + cp += strlen (cp); + } else if (rrc_num > 1) - fprintf (out, _(" %d reduce/reduce conflicts"), rrc_num); + { + sprintf (cp, _(" %d reduce/reduce conflicts"), rrc_num); + cp += strlen (cp); + } - putc ('.', out); - putc ('\n', out); + *cp++ = '.'; + *cp++ = '\n'; + *cp++ = '\0'; + + return res; } @@ -456,16 +476,17 @@ print_conflicts (void) src_total += src_count; rrc_total += rrc_count; - if (verboseflag) + if (verbose_flag) { - fprintf (foutput, _("State %d contains"), i); - conflict_report (foutput, src_count, rrc_count); + obstack_fgrow1 (&output_obstack, _("State %d contains"), i); + obstack_sgrow (&output_obstack, + conflict_report (src_count, rrc_count)); } } } /* Report the total number of conflicts on STDERR. */ - if (fixed_outfiles) + if (yacc_flag) { /* If invoked with `--yacc', use the output format specified by POSIX. */ @@ -481,7 +502,7 @@ print_conflicts (void) else { fprintf (stderr, _("%s contains"), infile); - conflict_report (stderr, src_total, rrc_total); + fputs (conflict_report (src_total, rrc_total), stderr); } } @@ -565,8 +586,9 @@ print_reductions (int state) for (i = 0; i < ntokens; i++) { if (mask & *fp3) - fprintf (foutput, _(" %-4s\t[reduce using rule %d (%s)]\n"), - tags[i], default_rule, tags[rlhs[default_rule]]); + obstack_fgrow3 (&output_obstack, + _(" %-4s\t[reduce using rule %d (%s)]\n"), + tags[i], default_rule, tags[rlhs[default_rule]]); mask <<= 1; if (mask == 0) @@ -576,8 +598,9 @@ print_reductions (int state) } } - fprintf (foutput, _(" $default\treduce using rule %d (%s)\n\n"), - default_rule, tags[rlhs[default_rule]]); + obstack_fgrow2 (&output_obstack, + _(" $default\treduce using rule %d (%s)\n\n"), + default_rule, tags[rlhs[default_rule]]); } else if (n - m >= 1) { @@ -664,7 +687,7 @@ print_reductions (int state) if (j != default_LA) { rule = LAruleno[j]; - fprintf (foutput, + obstack_fgrow3 (&output_obstack, _(" %-4s\treduce using rule %d (%s)\n"), tags[i], rule, tags[rlhs[rule]]); } @@ -678,13 +701,13 @@ print_reductions (int state) if (defaulted) { rule = LAruleno[default_LA]; - fprintf (foutput, + obstack_fgrow3 (&output_obstack, _(" %-4s\treduce using rule %d (%s)\n"), tags[i], rule, tags[rlhs[rule]]); defaulted = 0; } rule = LAruleno[j]; - fprintf (foutput, + obstack_fgrow3 (&output_obstack, _(" %-4s\t[reduce using rule %d (%s)]\n"), tags[i], rule, tags[rlhs[rule]]); } @@ -705,12 +728,11 @@ print_reductions (int state) } if (default_LA >= 0) - { - fprintf (foutput, _(" $default\treduce using rule %d (%s)\n"), - default_rule, tags[rlhs[default_rule]]); - } + obstack_fgrow2 (&output_obstack, + _(" $default\treduce using rule %d (%s)\n"), + default_rule, tags[rlhs[default_rule]]); - putc ('\n', foutput); + obstack_1grow (&output_obstack, '\n'); } }