bug-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: %prec using undefined token


From: Joel E. Denny
Subject: Re: %prec using undefined token
Date: Wed, 30 Dec 2009 04:57:20 -0500 (EST)
User-agent: Alpine 1.00 (DEB 882 2007-12-20)

On Wed, 30 Dec 2009, Joel E. Denny wrote:

> The patch below restores the complaint (as an error not a warning) for the 
> case when a %prec symbol is not defined, but it maintains the complaint 
> for the case when the symbol is a nonterminal.  This patch might break 
> compatibility with Bison 2.4 and 2.4.1.  I'm trying to decide if I should 
> rewrite it to be a warning in Bison 2.4.2 but an error in Bison 2.5 and 
> later.

I've decided I should, and I've found an easy way to do it.  I'm planning 
to push the first patch below to branch-2.4.2.  I'm planning to push both 
patches below to branch-2.5 and master.  I'll wait a little for comments.

>From 293185465c93e0e4818ea738b655dd9bace49a7c Mon Sep 17 00:00:00 2001
From: Joel E. Denny <address@hidden>
Date: Wed, 30 Dec 2009 03:20:11 -0500
Subject: [PATCH] POSIX: warn if %prec's token was not defined.

Reported by Florian Krohm at
<http://lists.gnu.org/archive/html/bug-bison/2009-12/msg00005.html>.
* NEWS (2.4.2): Document.
* src/reader.c (grammar_rule_check): Implement.
(grammar_current_rule_prec_set): Add comments explaining that we
here assume a %prec identifier is a token, but we still manage
to support POSIX.
* tests/input.at (%prec's token must be defined): New test
group.
---
 ChangeLog      |   13 +++++++++++++
 NEWS           |   10 ++++++++++
 src/reader.c   |   19 +++++++++++++++++++
 tests/input.at |   20 ++++++++++++++++++++
 4 files changed, 62 insertions(+), 0 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index f32a46e..b65f8c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2009-12-30  Joel E. Denny  <address@hidden>
+
+       POSIX: warn if %prec's token was not defined.
+       Reported by Florian Krohm at
+       <http://lists.gnu.org/archive/html/bug-bison/2009-12/msg00005.html>.
+       * NEWS (2.4.2): Document.
+       * src/reader.c (grammar_rule_check): Implement.
+       (grammar_current_rule_prec_set): Add comments explaining that we
+       here assume a %prec identifier is a token, but we still manage
+       to support POSIX.
+       * tests/input.at (%prec's token must be defined): New test
+       group.
+
 2009-12-21  Joel E. Denny  <address@hidden>
 
        YYFAIL: deprecate.
diff --git a/NEWS b/NEWS
index 9ef543e..9045431 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,16 @@ Bison News
 
 * Changes in version 2.4.2 (????-??-??):
 
+** `%prec IDENTIFIER' requires IDENTIFIER to be defined separately.
+
+  POSIX specifies that an error be reported for any identifier that does
+  not appear on the LHS of a grammar rule and that is not defined by
+  %token, %left, %right, or %nonassoc.  Bison 2.3b and later lost this
+  error report for the case when an identifier appears only after a
+  %prec directive.  It is now restored.  However, for backward
+  compatibility with recent Bison releases, it is only a warning for
+  now.  In Bison 2.5 and later, it will return to being an error.
+
 ** Detection of GNU M4 1.4.6 or newer during configure is improved.
 
 ** Warnings from gcc's -Wundef option about undefined YYENABLE_NLS,
diff --git a/src/reader.c b/src/reader.c
index 74d7dca..38191ee 100644
--- a/src/reader.c
+++ b/src/reader.c
@@ -292,6 +292,15 @@ grammar_rule_check (const symbol_list *r)
            warn_at (r->location, _("unset value: $$"));
        }
   }
+
+  /* See comments in grammar_current_rule_prec_set for how POSIX
+     mandates this complaint.  It's only for identifiers, so skip
+     it for char literals and strings, which are always tokens.  */
+  if (r->ruleprec
+      && r->ruleprec->tag[0] != '\'' && r->ruleprec->tag[0] != '"'
+      && !r->ruleprec->declared && !r->ruleprec->prec)
+    warn_at (r->location, _("token for %%prec is not defined: %s"),
+             r->ruleprec->tag);
 }
 
 
@@ -364,6 +373,16 @@ grammar_midrule_action (void)
 void
 grammar_current_rule_prec_set (symbol *precsym, location loc)
 {
+  /* POSIX says that any identifier is a nonterminal if it does not
+     appear on the LHS of a grammar rule and is not defined by %token
+     or by one of the directives that assigns precedence to a token.  We
+     ignore this here because the only kind of identifier that POSIX
+     allows to follow a %prec is a token and because assuming it's a
+     token now can produce more logical error messages.  Nevertheless,
+     grammar_rule_check does obey what we believe is the real intent of
+     POSIX here: that an error be reported for any identifier that
+     appears after %prec but that is not defined separately as a
+     token.  */
   symbol_class_set (precsym, token_sym, loc, false);
   if (current_rule->ruleprec)
     complain_at (loc, _("only one %s allowed per rule"), "%prec");
diff --git a/tests/input.at b/tests/input.at
index be84f9c..5cec25b 100644
--- a/tests/input.at
+++ b/tests/input.at
@@ -702,6 +702,26 @@ AT_BISON_CHECK([input.y], [1], [],
 AT_CLEANUP
 
 
+## ------------------------------- ##
+## %prec's token must be defined.  ##
+## ------------------------------- ##
+
+AT_SETUP([[%prec's token must be defined]])
+
+# According to POSIX, a %prec token must be defined separately.
+
+AT_DATA([[input.y]],
+[[%%
+start: %prec PREC ;
+]])
+
+AT_BISON_CHECK([[input.y]], [[0]], [],
+[[input.y:2.8-17: warning: token for %prec is not defined: PREC
+]])
+
+AT_CLEANUP
+
+
 ## -------------------------------- ##
 ## Reject unused %code qualifiers.  ##
 ## -------------------------------- ##
-- 
1.5.4.3

>From 43cddeaa14a63c82b40c6c2ae0bd66f5d9addd39 Mon Sep 17 00:00:00 2001
From: Joel E. Denny <address@hidden>
Date: Wed, 30 Dec 2009 03:14:12 -0500
Subject: [PATCH] POSIX: complain if %prec's token was not defined.

* NEWS (2.5): Document.
* src/reader.c (grammar_rule_check): Convert warning to
complaint.
* tests/input.at (%prec's token must be defined): Update.
---
 ChangeLog      |    8 ++++++++
 NEWS           |    6 ++++++
 src/reader.c   |    4 ++--
 tests/input.at |    4 ++--
 4 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index faf7b4a..d2111ba 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2009-12-30  Joel E. Denny  <address@hidden>
 
+       POSIX: complain if %prec's token was not defined.
+       * NEWS (2.5): Document.
+       * src/reader.c (grammar_rule_check): Convert warning to
+       complaint.
+       * tests/input.at (%prec's token must be defined): Update.
+
+2009-12-30  Joel E. Denny  <address@hidden>
+
        POSIX: warn if %prec's token was not defined.
        Reported by Florian Krohm at
        <http://lists.gnu.org/archive/html/bug-bison/2009-12/msg00005.html>.
diff --git a/NEWS b/NEWS
index 8e3280a..086325d 100644
--- a/NEWS
+++ b/NEWS
@@ -130,6 +130,12 @@ Bison News
   discussion of how to suppress C preprocessor warnings about YYFAIL
   being unused, see the Bison 2.4.2 NEWS entry.
 
+** `%prec IDENTIFIER' requires IDENTIFIER to be defined separately.
+
+  As promised in Bison 2.4.2's NEWS entry, it is now an error if a token
+  that appears after a %prec directive is not defined by %token, %left,
+  %right, or %nonassoc.  This is required by POSIX.
+
 ** Temporary hack for adding a semicolon to the user action.
 
   Previously, Bison appended a semicolon to every user action for
diff --git a/src/reader.c b/src/reader.c
index 250e4f8..3f00754 100644
--- a/src/reader.c
+++ b/src/reader.c
@@ -327,8 +327,8 @@ grammar_rule_check (const symbol_list *r)
   if (r->ruleprec
       && r->ruleprec->tag[0] != '\'' && r->ruleprec->tag[0] != '"'
       && !r->ruleprec->declared && !r->ruleprec->prec)
-    warn_at (r->location, _("token for %%prec is not defined: %s"),
-             r->ruleprec->tag);
+    complain_at (r->location, _("token for %%prec is not defined: %s"),
+                 r->ruleprec->tag);
 }
 
 
diff --git a/tests/input.at b/tests/input.at
index 3da6137..27f12f2 100644
--- a/tests/input.at
+++ b/tests/input.at
@@ -812,8 +812,8 @@ AT_DATA([[input.y]],
 start: %prec PREC ;
 ]])
 
-AT_BISON_CHECK([[input.y]], [[0]], [],
-[[input.y:2.8-17: warning: token for %prec is not defined: PREC
+AT_BISON_CHECK([[input.y]], [[1]], [],
+[[input.y:2.8-17: token for %prec is not defined: PREC
 ]])
 
 AT_CLEANUP
-- 
1.5.4.3





reply via email to

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