From 0df87bb6096b345a0a25714ee64c3a49596f2778 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 12 Nov 2001 09:31:40 +0000 Subject: [PATCH] * src/conflicts.c (count_sr_conflicts, count_rr_conflicts): Return the result instead of using... (src_total, rrc_total, src_count, rrc_count): Remove. (any_conflicts): Remove. (print_conflicts): Split into... (conflicts_print, conflicts_output): New. * src/conflicts.h: Adjust. * src/main.c (main): Invoke both conflicts_output and conflicts_print. * src/print.c (print_grammar): Issue `n' between to rule outputs. * tests/regression.at (Conflicts): New. Reported by Tom Lane. --- ChangeLog | 14 +++++ THANKS | 1 + src/conflicts.c | 136 +++++++++++++++++++++----------------------- src/conflicts.h | 4 +- src/main.c | 3 +- src/print.c | 8 +-- tests/regression.at | 95 +++++++++++++++++++++++++++++++ 7 files changed, 184 insertions(+), 77 deletions(-) diff --git a/ChangeLog b/ChangeLog index a6bec6f1..1fde180b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2001-11-12 Akim Demaille + + * src/conflicts.c (count_sr_conflicts, count_rr_conflicts): Return + the result instead of using... + (src_total, rrc_total, src_count, rrc_count): Remove. + (any_conflicts): Remove. + (print_conflicts): Split into... + (conflicts_print, conflicts_output): New. + * src/conflicts.h: Adjust. + * src/main.c (main): Invoke both conflicts_output and conflicts_print. + * src/print.c (print_grammar): Issue `\n' between to rule outputs. + * tests/regression.at (Conflicts): New. + Reported by Tom Lane. + 2001-11-12 Akim Demaille * tests/regression.at (Invalid input): Remove, duplicate with diff --git a/THANKS b/THANKS index f74230bb..ebf307b9 100644 --- a/THANKS +++ b/THANKS @@ -25,6 +25,7 @@ Piotr Gackiewicz gacek@intertel.com.pl Richard Stallman rms@gnu.org Robert Anisko anisko_r@epita.fr Shura debil_urod@ngs.ru +Tom Lane tgl@sss.pgh.pa.us Wwp subscript@free.fr Many people are not named here because we lost track of them. We diff --git a/src/conflicts.c b/src/conflicts.c index 0f63f401..0af00c70 100644 --- a/src/conflicts.c +++ b/src/conflicts.c @@ -28,15 +28,12 @@ #include "reader.h" #include "LR0.h" -int any_conflicts = 0; errs **err_table = NULL; int expected_conflicts; static char *conflicts = NULL; static unsigned *shiftset = NULL; static unsigned *lookaheadset = NULL; -static int src_count; -static int rrc_count; static inline void @@ -244,13 +241,8 @@ set_conflicts (int state) fp3 = lookaheadset; while (fp3 < fp4) - { - if (*fp2++ & *fp3++) - { - conflicts[state] = 1; - any_conflicts = 1; - } - } + if (*fp2++ & *fp3++) + conflicts[state] = 1; fp2 = fp1; fp3 = lookaheadset; @@ -271,8 +263,6 @@ solve_conflicts (void) err_table = XCALLOC (errs *, nstates); - any_conflicts = 0; - for (i = 0; i < nstates; i++) set_conflicts (i); } @@ -282,7 +272,7 @@ solve_conflicts (void) | Count the number of shift/reduce conflicts. | `---------------------------------------------*/ -static void +static int count_sr_conflicts (int state) { int i; @@ -294,11 +284,11 @@ count_sr_conflicts (int state) unsigned *fp3; int symbol; - src_count = 0; + int src_count = 0; shiftp = shift_table[state]; if (!shiftp) - return; + return 0; for (i = 0; i < tokensetsize; i++) { @@ -349,6 +339,8 @@ count_sr_conflicts (int state) fp2++; } } + + return src_count; } @@ -356,33 +348,29 @@ count_sr_conflicts (int state) | Count the number of reduce/reduce conflicts. | `----------------------------------------------*/ -static void +static int count_rr_conflicts (int state) { int i; - int j; - int count; unsigned mask; unsigned *baseword; - unsigned *wordp; - int m; - int n; - rrc_count = 0; + int rrc_count = 0; - m = lookaheads[state]; - n = lookaheads[state + 1]; + int m = lookaheads[state]; + int n = lookaheads[state + 1]; if (n - m < 2) - return; + return 0; mask = 1; baseword = LA + m * tokensetsize; for (i = 0; i < ntokens; i++) { - wordp = baseword; + unsigned *wordp = baseword; - count = 0; + int count = 0; + int j; for (j = m; j < n; j++) { if (mask & *wordp) @@ -401,6 +389,8 @@ count_rr_conflicts (int state) baseword++; } } + + return rrc_count; } /*--------------------------------------------------------------. @@ -450,58 +440,64 @@ conflict_report (int src_num, int rrc_num) } -/*---------------------------------------------. -| Compute and give a report on the conflicts. | -`---------------------------------------------*/ +/*-----------------------------------------------------------. +| Output the detailed description of states with conflicts. | +`-----------------------------------------------------------*/ void -print_conflicts (FILE *out) +conflicts_output (FILE *out) { int i; - int src_total; - int rrc_total; + for (i = 0; i < nstates; i++) + if (conflicts[i]) + { + fprintf (out, _("State %d contains"), i); + fputs (conflict_report (count_sr_conflicts (i), + count_rr_conflicts (i)), out); + } +} - 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]) - { - count_sr_conflicts (i); - count_rr_conflicts (i); - src_total += src_count; - rrc_total += rrc_count; +/*------------------------------------------. +| Reporting the total number of conflicts. | +`------------------------------------------*/ - if (verbose_flag) - { - fprintf (out, _("State %d contains"), i); - fputs (conflict_report (src_count, rrc_count), out); - } - } - } +void +conflicts_print (void) +{ + int i; + + int src_total = 0; + int rrc_total = 0; + + /* Conflicts by state. */ + for (i = 0; i < nstates; i++) + if (conflicts[i]) + { + src_total += count_sr_conflicts (i); + rrc_total += count_rr_conflicts (i); + } /* Report the total number of conflicts on STDERR. */ - if (yacc_flag) - { - /* 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); - } + if (src_total || rrc_total) + if (yacc_flag) + { + /* 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); + } } diff --git a/src/conflicts.h b/src/conflicts.h index 99a504c8..ad5d4893 100644 --- a/src/conflicts.h +++ b/src/conflicts.h @@ -23,12 +23,12 @@ # include "state.h" void solve_conflicts PARAMS ((void)); -void print_conflicts PARAMS ((FILE *out)); +void conflicts_print PARAMS ((void)); +void conflicts_output PARAMS ((FILE *out)); void print_reductions PARAMS ((int)); void free_conflicts PARAMS ((void)); /* Were there conflicts? */ -extern int any_conflicts; extern errs **err_table; extern int expected_conflicts; #endif /* !CONFLICTS_H_ */ diff --git a/src/main.c b/src/main.c index 9cea3ff4..bc9812f2 100644 --- a/src/main.c +++ b/src/main.c @@ -84,6 +84,7 @@ main (int argc, char *argv[]) conflicts. Also resolve s/r conflicts based on precedence declarations. */ solve_conflicts (); + conflicts_print (); /* Output file names. */ compute_output_file_names (); @@ -93,7 +94,7 @@ main (int argc, char *argv[]) if (complain_message_count) exit (1); - /* Print information about results, if requested. */ + /* Output the detailed report on the grammar. */ print_results (); /* Output the VCG graph. */ diff --git a/src/print.c b/src/print.c index ccafbdc6..bd1e387c 100644 --- a/src/print.c +++ b/src/print.c @@ -226,7 +226,7 @@ print_grammar (FILE *out) int column = 0; /* rule # : LHS -> RHS */ - fprintf (out, "\n%s\n", _("Grammar")); + fprintf (out, "\n%s\n\n", _("Grammar")); for (i = 1; i <= nrules; i++) /* Don't print rules disabled in reduce_grammar_tables. */ if (rlhs[i] >= 0) @@ -237,7 +237,8 @@ print_grammar (FILE *out) while (*rule > 0) fprintf (out, " %s", tags[*rule++]); else - fprintf (out, " /* %s */\n", _("empty")); + fprintf (out, " /* %s */", _("empty")); + fputc ('\n', out); } /* TERMINAL (type #) : rule #s terminal is on RHS */ @@ -336,8 +337,7 @@ print_results (void) size_t size = obstack_object_size (&output_obstack); fwrite (obstack_finish (&output_obstack), 1, size, out); - if (any_conflicts) - print_conflicts (out); + conflicts_output (out); print_grammar (out); diff --git a/tests/regression.at b/tests/regression.at index abdaff5d..047d7519 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -43,6 +43,101 @@ AT_CHECK([bison -v duplicate.y -o duplicate.c], 0, ignore, ignore) AT_CLEANUP([duplicate.*]) +## ----------- ## +## Conflicts. ## +## ----------- ## + +AT_SETUP([Conflicts]) + +AT_DATA([input.y], +[[%token NUM OP +%% +exp: exp OP exp | NUM; +]]) + +AT_CHECK([bison input.y -o input.c -v], 0, [], +[input.y contains 1 shift/reduce conflict. +]) + +# Check the contents of the report. +AT_CHECK([cat input.output], [], +[[State 4 contains 1 shift/reduce conflict. + +Grammar + +rule 1 exp -> exp OP exp +rule 2 exp -> NUM + +Terminals, with rules where they appear + +$ (-1) +error (256) +NUM (257) 2 +OP (258) 1 + +Nonterminals, with rules where they appear + +exp (5) + on left: 1 2, on right: 1 + + +state 0 + + NUM shift, and go to state 1 + + exp go to state 2 + + + +state 1 + + exp -> NUM . (rule 2) + + $default reduce using rule 2 (exp) + + + +state 2 + + exp -> exp . OP exp (rule 1) + + $ go to state 5 + OP shift, and go to state 3 + + + +state 3 + + exp -> exp OP . exp (rule 1) + + NUM shift, and go to state 1 + + exp go to state 4 + + + +state 4 + + exp -> exp . OP exp (rule 1) + exp -> exp OP exp . (rule 1) + + OP shift, and go to state 3 + + + +state 5 + + $ go to state 6 + + + +state 6 + + $default accept +]]) + +AT_CLEANUP(input.c input.output) + ## ---------------------- ## ## Mixing %token styles. ## -- 2.45.2