X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/720d742f8e74acf1ade85a7d39c02fa5b9528b5a..4134cae3c5ff2fc3346ebc5b10d5c25c72c72cfe:/src/conflicts.c diff --git a/src/conflicts.c b/src/conflicts.c index 08bc1feb..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. @@ -20,27 +20,20 @@ #include "system.h" #include "getargs.h" -#include "alloc.h" +#include "xalloc.h" #include "files.h" #include "gram.h" #include "state.h" #include "lalr.h" +#include "conflicts.h" +#include "reader.h" +#include "LR0.h" -extern char **tags; -extern int fixed_outfiles; - -extern void initialize_conflicts PARAMS ((void)); -extern void conflict_log PARAMS ((void)); -extern void verbose_conflict_log PARAMS ((void)); -extern void print_reductions PARAMS ((int)); -extern void finalize_conflicts PARAMS ((void)); - -char any_conflicts; +int any_conflicts = 0; errs **err_table; int expected_conflicts; static char *conflicts; - static unsigned *shiftset; static unsigned *lookaheadset; static int src_total; @@ -52,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); } @@ -102,7 +94,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 */ @@ -138,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; @@ -182,7 +174,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 @@ -275,13 +267,12 @@ void initialize_conflicts (void) { int i; -/* errs *sp; JF unused */ - 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; @@ -290,13 +281,6 @@ initialize_conflicts (void) } - - - - - - - /*---------------------------------------------. | Count the number of shift/reduce conflicts. | `---------------------------------------------*/ @@ -422,49 +406,50 @@ count_rr_conflicts (int state) } } -/*------------------------------------. -| Give a report about the conflicts. | -`------------------------------------*/ +/*--------------------------------------------------------------. +| Return a human readable string which reports shift/reduce and | +| reduce/reduce conflict numbers (SRC_NUM, RRC_NUM). | +`--------------------------------------------------------------*/ -static void -total_conflicts (void) +static const char * +conflict_report (int src_num, int rrc_num) { - if (src_total == expected_conflicts && rrc_total == 0) - return; + static char res[4096]; + char *cp = res; - if (fixed_outfiles) + if (src_num == 1) { - /* If invoked under the name `yacc', use the output format - specified by POSIX. */ - fprintf (stderr, _("conflicts: ")); - if (src_total > 0) - fprintf (stderr, _(" %d shift/reduce"), src_total); - if (src_total > 0 && rrc_total > 0) - fprintf (stderr, ","); - if (rrc_total > 0) - fprintf (stderr, _(" %d reduce/reduce"), rrc_total); - putc ('\n', stderr); + sprintf (cp, _(" 1 shift/reduce conflict")); + cp += strlen (cp); } - else + else if (src_num > 1) { - fprintf (stderr, _("%s contains"), infile); + sprintf (cp, _(" %d shift/reduce conflicts"), src_num); + cp += strlen (cp); + } - if (src_total == 1) - fprintf (stderr, _(" 1 shift/reduce conflict")); - else if (src_total > 1) - fprintf (stderr, _(" %d shift/reduce conflicts"), src_total); + if (src_num > 0 && rrc_num > 0) + { + sprintf (cp, _(" and")); + cp += strlen (cp); + } - if (src_total > 0 && rrc_total > 0) - fprintf (stderr, _(" and")); + if (rrc_num == 1) + { + sprintf (cp, _(" 1 reduce/reduce conflict")); + cp += strlen (cp); + } + else if (rrc_num > 1) + { + sprintf (cp, _(" %d reduce/reduce conflicts"), rrc_num); + cp += strlen (cp); + } - if (rrc_total == 1) - fprintf (stderr, _(" 1 reduce/reduce conflict")); - else if (rrc_total > 1) - fprintf (stderr, _(" %d reduce/reduce conflicts"), rrc_total); + *cp++ = '.'; + *cp++ = '\n'; + *cp++ = '\0'; - putc ('.', stderr); - putc ('\n', stderr); - } + return res; } @@ -473,13 +458,15 @@ total_conflicts (void) `---------------------------------------------*/ void -conflict_log (void) +print_conflicts (void) { int i; src_total = 0; rrc_total = 0; + /* Count the total number of conflicts, and if wanted, give a + detailed report in FOUTPUT. */ for (i = 0; i < nstates; i++) { if (conflicts[i]) @@ -488,58 +475,38 @@ conflict_log (void) count_rr_conflicts (i); src_total += src_count; rrc_total += rrc_count; + + if (verbose_flag) + { + obstack_fgrow1 (&output_obstack, _("State %d contains"), i); + obstack_sgrow (&output_obstack, + conflict_report (src_count, rrc_count)); + } } } - total_conflicts (); -} - - -void -verbose_conflict_log (void) -{ - int i; - - src_total = 0; - rrc_total = 0; - - for (i = 0; i < nstates; i++) + /* Report the total number of conflicts on STDERR. */ + if (yacc_flag) { - if (conflicts[i]) - { - count_sr_conflicts (i); - count_rr_conflicts (i); - src_total += src_count; - rrc_total += rrc_count; - - fprintf (foutput, _("State %d contains"), i); - - if (src_count == 1) - fprintf (foutput, _(" 1 shift/reduce conflict")); - else if (src_count > 1) - fprintf (foutput, _(" %d shift/reduce conflicts"), src_count); - - if (src_count > 0 && rrc_count > 0) - fprintf (foutput, _(" and")); - - if (rrc_count == 1) - fprintf (foutput, _(" 1 reduce/reduce conflict")); - else if (rrc_count > 1) - fprintf (foutput, _(" %d reduce/reduce conflicts"), rrc_count); - - putc ('.', foutput); - putc ('\n', foutput); - } + /* If invoked with `--yacc', use the output format specified by + POSIX. */ + fprintf (stderr, _("conflicts: ")); + if (src_total > 0) + fprintf (stderr, _(" %d shift/reduce"), src_total); + if (src_total > 0 && rrc_total > 0) + fprintf (stderr, ","); + if (rrc_total > 0) + fprintf (stderr, _(" %d reduce/reduce"), rrc_total); + putc ('\n', stderr); + } + else + { + fprintf (stderr, _("%s contains"), infile); + fputs (conflict_report (src_total, rrc_total), stderr); } - - total_conflicts (); } - - - - void print_reductions (int state) { @@ -619,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) @@ -630,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) { @@ -718,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]]); } @@ -732,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]]); } @@ -759,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'); } } @@ -772,7 +740,7 @@ print_reductions (int state) void finalize_conflicts (void) { - FREE (conflicts); - FREE (shiftset); - FREE (lookaheadset); + XFREE (conflicts); + XFREE (shiftset); + XFREE (lookaheadset); }