[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Unsatisfied %expectations
From: |
Paul Eggert |
Subject: |
Re: Unsatisfied %expectations |
Date: |
Fri, 18 Nov 2005 10:19:02 -0800 |
User-agent: |
Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux) |
Akim Demaille <address@hidden> writes:
> I was just horrified to discover that unmet %expect are not errors.
We talked about that a while back and decided to change it later.
I guess now is as good a time as any.
That patch causes "make check" to fail, so I altered it. I also notice
that the diagnostics were saying "foo.y: foo.y: ...." in some cases so
I fixed that too. I installed the following.
2005-11-18 Paul Eggert <address@hidden>
* 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 <address@hidden>
* src/conflicts.c (conflicts_print): Unsatisfied %expectation are
errors.
* NEWS: Document this.
* doc/bison.texinfo (Expect Decl): Likewise.
Index: NEWS
===================================================================
RCS file: /cvsroot/bison/bison/NEWS,v
retrieving revision 1.130
diff -p -u -r1.130 NEWS
--- NEWS 21 Oct 2005 11:36:22 -0000 1.130
+++ NEWS 18 Nov 2005 18:16:12 -0000
@@ -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.
Index: doc/bison.texinfo
===================================================================
RCS file: /cvsroot/bison/bison/doc/bison.texinfo,v
retrieving revision 1.166
diff -p -u -r1.166 bison.texinfo
--- doc/bison.texinfo 12 Nov 2005 14:13:03 -0000 1.166
+++ doc/bison.texinfo 18 Nov 2005 18:16:12 -0000
@@ -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.
-
-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:
+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 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
address@hidden 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
Index: src/conflicts.c
===================================================================
RCS file: /cvsroot/bison/bison/src/conflicts.c,v
retrieving revision 1.111
diff -p -u -r1.111 conflicts.c
--- src/conflicts.c 14 May 2005 06:49:47 -0000 1.111
+++ src/conflicts.c 18 Nov 2005 18:16:12 -0000
@@ -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);
}
}
Index: tests/conflicts.at
===================================================================
RCS file: /cvsroot/bison/bison/tests/conflicts.at,v
retrieving revision 1.30
diff -p -u -r1.30 conflicts.at
--- tests/conflicts.at 18 Jul 2005 06:14:16 -0000 1.30
+++ tests/conflicts.at 18 Nov 2005 18:16:12 -0000
@@ -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