X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/c29240e74b6f81a3bc37a3b0e718479b2e7f16c3..5af1f54933220f178509b15ec6b7f65a780630f1:/src/conflicts.c diff --git a/src/conflicts.c b/src/conflicts.c index 418b1072..f89c3a38 100644 --- a/src/conflicts.c +++ b/src/conflicts.c @@ -20,34 +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 tokensetsize; -extern char *consistent; -extern short *accessing_symbol; -extern shifts **shift_table; -extern unsigned *LA; -extern short *LAruleno; -extern short *lookaheads; -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; @@ -59,7 +45,7 @@ static int rrc_count; static inline void log_resolution (int state, int LAno, int token, char *resolution) { - if (verboseflag) + if (verbose_flag) fprintf (foutput, _("\ Conflict in state %d between rule %d and token %s resolved as %s.\n"), @@ -109,7 +95,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 */ @@ -145,29 +131,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; @@ -189,7 +175,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 @@ -282,13 +268,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; @@ -297,13 +282,6 @@ initialize_conflicts (void) } - - - - - - - /*---------------------------------------------. | Count the number of shift/reduce conflicts. | `---------------------------------------------*/ @@ -429,49 +407,29 @@ count_rr_conflicts (int state) } } -/*------------------------------------. -| Give a report about the conflicts. | -`------------------------------------*/ +/*----------------------------------------------------------. +| Output to OUT a human readable report on shift/reduce and | +| reduce/reduce conflict numbers (SRC_NUM, RRC_NUM). | +`----------------------------------------------------------*/ static void -total_conflicts (void) +conflict_report (FILE *out, int src_num, int rrc_num) { - if (src_total == expected_conflicts && rrc_total == 0) - return; + if (src_num == 1) + fprintf (out, _(" 1 shift/reduce conflict")); + else if (src_num > 1) + fprintf (out, _(" %d shift/reduce conflicts"), src_num); - if (fixed_outfiles) - { - /* 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); - } - else - { - fprintf (stderr, _("%s contains"), infile); - - 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_total > 0 && rrc_total > 0) - fprintf (stderr, _(" and")); + if (src_num > 0 && rrc_num > 0) + fprintf (out, _(" and")); - if (rrc_total == 1) - fprintf (stderr, _(" 1 reduce/reduce conflict")); - else if (rrc_total > 1) - fprintf (stderr, _(" %d reduce/reduce conflicts"), rrc_total); + if (rrc_num == 1) + fprintf (out, _(" 1 reduce/reduce conflict")); + else if (rrc_num > 1) + fprintf (out, _(" %d reduce/reduce conflicts"), rrc_num); - putc ('.', stderr); - putc ('\n', stderr); - } + putc ('.', out); + putc ('\n', out); } @@ -480,13 +438,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]) @@ -495,58 +455,37 @@ conflict_log (void) count_rr_conflicts (i); src_total += src_count; rrc_total += rrc_count; + + if (verbose_flag) + { + fprintf (foutput, _("State %d contains"), i); + conflict_report (foutput, 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); + conflict_report (stderr, src_total, rrc_total); } - - total_conflicts (); } - - - - void print_reductions (int state) { @@ -779,7 +718,7 @@ print_reductions (int state) void finalize_conflicts (void) { - FREE (conflicts); - FREE (shiftset); - FREE (lookaheadset); + XFREE (conflicts); + XFREE (shiftset); + XFREE (lookaheadset); }