bison-patches
[Top][All Lists]
Advanced

[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
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]