X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/0619caf0b1e1f05b710bac41bcefa6d12206f285..ee006e3a4c1e6e8e9f4a1826845d6e27b51d01fb:/src/conflicts.c diff --git a/src/conflicts.c b/src/conflicts.c index 2ade63da..626db934 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. @@ -20,23 +20,21 @@ #include "system.h" #include "getargs.h" -#include "alloc.h" #include "files.h" #include "gram.h" #include "state.h" #include "lalr.h" #include "conflicts.h" - -extern char **tags; -extern int fixed_outfiles; +#include "reader.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; @@ -46,11 +44,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); } @@ -96,7 +93,7 @@ resolve_sr_conflict (int state, int lookaheadnum) unsigned *fp1; unsigned *fp2; int redprec; - errs *errp = (errs *) xmalloc (sizeof (errs) + ntokens * sizeof (short)); + errs *errp = (errs *) xcalloc (sizeof (errs) + ntokens * sizeof (short), 1); short *errtokens = errp->errs; /* find the rule to reduce by to get precedence of reduction */ @@ -132,29 +129,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; @@ -176,7 +173,7 @@ resolve_sr_conflict (int state, int lookaheadnum) /* Some tokens have been explicitly made errors. Allocate a permanent errs structure for this state, to record them. */ i = (char *) errtokens - (char *) errp; - err_table[state] = (errs *) xmalloc ((unsigned int) i); + err_table[state] = (errs *) xcalloc ((unsigned int) i, 1); bcopy (errp, err_table[state], i); } else @@ -266,15 +263,15 @@ set_conflicts (int state) } void -initialize_conflicts (void) +solve_conflicts (void) { int i; - conflicts = NEW2 (nstates, char); - shiftset = NEW2 (tokensetsize, unsigned); - lookaheadset = NEW2 (tokensetsize, unsigned); + conflicts = XCALLOC (char, nstates); + shiftset = XCALLOC (unsigned, tokensetsize); + lookaheadset = XCALLOC (unsigned, tokensetsize); - err_table = NEW2 (nstates, errs *); + err_table = XCALLOC (errs *, nstates); any_conflicts = 0; @@ -408,29 +405,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); + } + + *cp++ = '.'; + *cp++ = '\n'; + *cp++ = '\0'; - putc ('.', out); - putc ('\n', out); + return res; } @@ -439,7 +457,7 @@ conflict_report (FILE *out, int src_num, int rrc_num) `---------------------------------------------*/ void -print_conflicts (void) +print_conflicts (FILE *out) { int i; @@ -457,16 +475,16 @@ 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); + fprintf (out, _("State %d contains"), i); + fputs (conflict_report (src_count, rrc_count), out); } } } /* 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. */ @@ -482,7 +500,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); } } @@ -566,8 +584,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) @@ -577,8 +596,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) { @@ -665,7 +685,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]]); } @@ -679,13 +699,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]]); } @@ -706,20 +726,19 @@ 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'); } } void -finalize_conflicts (void) +free_conflicts (void) { - FREE (conflicts); - FREE (shiftset); - FREE (lookaheadset); + XFREE (conflicts); + XFREE (shiftset); + XFREE (lookaheadset); }