/* 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.
#include "system.h"
#include "getargs.h"
-#include "xalloc.h"
#include "files.h"
#include "gram.h"
#include "state.h"
#include "LR0.h"
int any_conflicts = 0;
-errs **err_table;
+errs **err_table = NULL;
int expected_conflicts;
-static char *conflicts;
+static char *conflicts = NULL;
-static unsigned *shiftset;
-static unsigned *lookaheadset;
+static unsigned *shiftset = NULL;
+static unsigned *lookaheadset = NULL;
static int src_total;
static int rrc_total;
static int src_count;
static inline void
log_resolution (int state, int LAno, int token, char *resolution)
{
- if (verbose_flag)
- 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);
}
}
void
-initialize_conflicts (void)
+solve_conflicts (void)
{
int 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;
}
`---------------------------------------------*/
void
-print_conflicts (void)
+print_conflicts (FILE *out)
{
int i;
if (verbose_flag)
{
- fprintf (foutput, _("State %d contains"), i);
- conflict_report (foutput, src_count, rrc_count);
+ fprintf (out, _("State %d contains"), i);
+ fputs (conflict_report (src_count, rrc_count), out);
}
}
}
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');
}
}
void
-finalize_conflicts (void)
+free_conflicts (void)
{
XFREE (conflicts);
XFREE (shiftset);