From 035aa4a0bbf1847843c48312d892f79599ba7d8a Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 18 Nov 2005 18:16:44 +0000 Subject: [PATCH] * src/conflicts.c (conflicts_print): Don't print file name twice when %expect fails because there were no conflicts. * doc/bison.texinfo (Expect Decl): Tighten up wording in previous change. * tests/conflicts.at (%expect not enough, %expect too much): (%expect with reduce conflicts): Adjust to new behavior. * src/conflicts.c (conflicts_print): Unsatisfied %expectation are errors. * NEWS: Document this. * doc/bison.texinfo (Expect Decl): Likewise. --- ChangeLog | 16 ++++++++++++++++ NEWS | 4 ++++ doc/bison.texinfo | 31 +++++++++++++++---------------- src/conflicts.c | 43 ++++++++++++++++++++++++------------------- tests/conflicts.at | 12 ++++++------ 5 files changed, 65 insertions(+), 41 deletions(-) diff --git a/ChangeLog b/ChangeLog index b0fd56f8..c52dc0db 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2005-11-18 Paul Eggert + + * src/conflicts.c (conflicts_print): Don't print file name twice + when %expect fails because there were no conflicts. + * doc/bison.texinfo (Expect Decl): Tighten up wording in previous + change. + * tests/conflicts.at (%expect not enough, %expect too much): + (%expect with reduce conflicts): Adjust to new behavior. + +2005-11-18 Akim Demaille + + * src/conflicts.c (conflicts_print): Unsatisfied %expectation are + errors. + * NEWS: Document this. + * doc/bison.texinfo (Expect Decl): Likewise. + 2005-11-16 Akim Demaille Generalize the display of semantic values and locations in traces. diff --git a/NEWS b/NEWS index de75edb6..ec0a8dec 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,10 @@ Bison News Changes in version 2.1a: +* %expect, %expect-rr + Incorrect numbers of expected conflicts are now actual errors, + instead of warnings. + * GLR, YACC parsers. The %parse-params are available in the %destructor's (and the experimental %printer's) as per the documentation. diff --git a/doc/bison.texinfo b/doc/bison.texinfo index 47b6720e..641e6db5 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -3913,19 +3913,18 @@ The declaration looks like this: %expect @var{n} @end example -Here @var{n} is a decimal integer. The declaration says there should be -no warning if there are @var{n} shift/reduce conflicts and no -reduce/reduce conflicts. The usual warning is -given if there are either more or fewer conflicts, or if there are any -reduce/reduce conflicts. +Here @var{n} is a decimal integer. The declaration says there should +be @var{n} shift/reduce conflicts and no reduce/reduce conflicts. +Bison reports an error if the number of shift/reduce conflicts differs +from @var{n}, or if there are any reduce/reduce conflicts. -For normal @acronym{LALR}(1) parsers, reduce/reduce conflicts are more serious, -and should be eliminated entirely. Bison will always report -reduce/reduce conflicts for these parsers. With @acronym{GLR} parsers, however, -both shift/reduce and reduce/reduce are routine (otherwise, there -would be no need to use @acronym{GLR} parsing). Therefore, it is also possible -to specify an expected number of reduce/reduce conflicts in @acronym{GLR} -parsers, using the declaration: +For normal @acronym{LALR}(1) parsers, reduce/reduce conflicts are more +serious, and should be eliminated entirely. Bison will always report +reduce/reduce conflicts for these parsers. With @acronym{GLR} +parsers, however, both kinds of conflicts are routine; otherwise, +there would be no need to use @acronym{GLR} parsing. Therefore, it is +also possible to specify an expected number of reduce/reduce conflicts +in @acronym{GLR} parsers, using the declaration: @example %expect-rr @var{n} @@ -3946,12 +3945,12 @@ go back to the beginning. @item Add an @code{%expect} declaration, copying the number @var{n} from the -number which Bison printed. +number which Bison printed. With @acronym{GLR} parsers, add an +@code{%expect-rr} declaration as well. @end itemize -Now Bison will stop annoying you if you do not change the number of -conflicts, but it will warn you again if changes in the grammar result -in more or fewer conflicts. +Now Bison will warn you if you introduce an unexpected conflict, but +will keep silent otherwise. @node Start Decl @subsection The Start-Symbol diff --git a/src/conflicts.c b/src/conflicts.c index ede39690..374c4010 100644 --- a/src/conflicts.c +++ b/src/conflicts.c @@ -1,6 +1,6 @@ /* Find and resolve or report look-ahead conflicts for bison, - Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2003, 2004 + Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -464,11 +464,13 @@ conflicts_print (void) /* Is the number of SR conflicts OK? Either EXPECTED_CONFLICTS is not set, and then we want 0 SR, or else it is specified, in which case we want equality. */ - bool src_ok = false; - bool rrc_ok = false; + bool src_ok; + bool rrc_ok; int src_total = 0; int rrc_total = 0; + int src_expected; + int rrc_expected; /* Conflicts by state. */ { @@ -488,33 +490,36 @@ conflicts_print (void) expected_rr_conflicts = -1; } - src_ok = - src_total == (expected_sr_conflicts == -1 ? 0 : expected_sr_conflicts); - rrc_ok = - rrc_total == (expected_rr_conflicts == -1 ? 0 : expected_rr_conflicts); + src_expected = expected_sr_conflicts == -1 ? 0 : expected_sr_conflicts; + rrc_expected = expected_rr_conflicts == -1 ? 0 : expected_rr_conflicts; + src_ok = src_total == src_expected; + rrc_ok = rrc_total == rrc_expected; /* If there are as many RR conflicts and SR conflicts as expected, then there is nothing to report. */ - if (rrc_ok && src_ok) + if (rrc_ok & src_ok) return; /* Report the total number of conflicts on STDERR. */ - if (! yacc_flag) - fprintf (stderr, "%s: ", current_file); - conflict_report (stderr, src_total, rrc_total); + if (src_total | rrc_total) + { + if (! yacc_flag) + fprintf (stderr, "%s: ", current_file); + conflict_report (stderr, src_total, rrc_total); + } if (expected_sr_conflicts != -1 || expected_rr_conflicts != -1) { - int sr = expected_sr_conflicts == -1 ? 0 : expected_sr_conflicts; - int rr = expected_rr_conflicts == -1 ? 0 : expected_rr_conflicts; if (! src_ok) - warn (ngettext ("expected %d shift/reduce conflict", - "expected %d shift/reduce conflicts", - sr), sr); + complain (ngettext ("expected %d shift/reduce conflict", + "expected %d shift/reduce conflicts", + src_expected), + src_expected); if (! rrc_ok) - warn (ngettext ("expected %d reduce/reduce conflict", - "expected %d reduce/reduce conflicts", - rr), rr); + complain (ngettext ("expected %d reduce/reduce conflict", + "expected %d reduce/reduce conflicts", + rrc_expected), + rrc_expected); } } diff --git a/tests/conflicts.at b/tests/conflicts.at index 9b503b63..1cbf23ac 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -482,9 +482,9 @@ AT_DATA([input.y], exp: exp OP exp | NUM; ]]) -AT_CHECK([bison -o input.c input.y], 0, [], +AT_CHECK([bison -o input.c input.y], 1, [], [input.y: conflicts: 1 shift/reduce -input.y: warning: expected 0 shift/reduce conflicts +input.y: expected 0 shift/reduce conflicts ]) AT_CLEANUP @@ -519,9 +519,9 @@ AT_DATA([input.y], exp: exp OP exp | NUM; ]]) -AT_CHECK([bison -o input.c input.y], 0, [], +AT_CHECK([bison -o input.c input.y], 1, [], [input.y: conflicts: 1 shift/reduce -input.y: warning: expected 2 shift/reduce conflicts +input.y: expected 2 shift/reduce conflicts ]) AT_CLEANUP @@ -539,9 +539,9 @@ program: a 'a' | a a; a: 'a'; ]]) -AT_CHECK([bison -o input.c input.y], 0, [], +AT_CHECK([bison -o input.c input.y], 1, [], [input.y: conflicts: 1 reduce/reduce -input.y: warning: expected 0 reduce/reduce conflicts +input.y: expected 0 reduce/reduce conflicts ]) AT_CLEANUP -- 2.45.2