/* 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.
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);
}
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;
}
}
-/*----------------------------------------------------------.
-| 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;
}
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. */
else
{
fprintf (stderr, _("%s contains"), infile);
- conflict_report (stderr, src_total, rrc_total);
+ fputs (conflict_report (src_total, rrc_total), stderr);
}
}
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)
}
}
- 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)
{
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]]);
}
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]]);
}
}
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');
}
}