Pushed in master and branch-2.5.

        * data/bison.m4 (b4_percent_define_if_define_): Also map dashes to
        underscores.
        * src/scan-gram.l ({id}): Also accept dashes after the initial
        letter.
        ({directive}): Use {id}.
        * src/parse-gram.y: Comment and formatting changes.
        * doc/bison.texinfo (Symbols): Adjust the lexical definitions of
        symbols.
        * src/complain.h, src/complain.c (yacc_at): New.
        * src/symtab.c (symbol_new): Use yacc_at to report inappropriate
        symbol names.
        * src/output.c (token_definitions_output): Do not #define token
        names with dashes.

From 4f646c3794c45940aaf96d5409eff02a2c74978e Mon Sep 17 00:00:00 2001
From: Akim Demaille <[email protected]>
Date: Mon, 20 Apr 2009 12:24:23 +0200
Subject: [PATCH 1/3] variables: accept dashes.

        * data/bison.m4 (b4_percent_define_if_define_): Also map dashes to
        underscores.
        * src/scan-gram.l ({id}): Also accept dashes after the initial
        letter.
        ({directive}): Use {id}.
        * src/parse-gram.y: Comment and formatting changes.
        * doc/bison.texinfo (Symbols): Adjust the lexical definitions of
        symbols.
        * src/complain.h, src/complain.c (yacc_at): New.
        * src/symtab.c (symbol_new): Use yacc_at to report inappropriate
        symbol names.
        * src/output.c (token_definitions_output): Do not #define token
        names with dashes.
---
 ChangeLog         |   17 +++++++++++++++++
 data/bison.m4     |    5 +++--
 doc/bison.texinfo |    8 ++++++--
 src/complain.c    |   23 ++++++++++++++++++++++-
 src/complain.h    |    9 ++++++++-
 src/output.c      |    8 +++++---
 src/parse-gram.y  |    7 ++-----
 src/scan-gram.l   |    6 +++---
 src/symtab.c      |   10 +++++++++-
 9 files changed, 75 insertions(+), 18 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ff36a34..b8a5748 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
 2009-04-20  Akim Demaille  <[email protected]>
 
+       variables: accept dashes.
+       * data/bison.m4 (b4_percent_define_if_define_): Also map dashes to
+       underscores.
+       * src/scan-gram.l ({id}): Also accept dashes after the initial
+       letter.
+       ({directive}): Use {id}.
+       * src/parse-gram.y: Comment and formatting changes.
+       * doc/bison.texinfo (Symbols): Adjust the lexical definitions of
+       symbols.
+       * src/complain.h, src/complain.c (yacc_at): New.
+       * src/symtab.c (symbol_new): Use yacc_at to report inappropriate
+       symbol names.
+       * src/output.c (token_definitions_output): Do not #define token
+       names with dashes.
+
+2009-04-20  Akim Demaille  <[email protected]>
+
        Consistently refer to Yacc, not YACC.
        * src/getargs.c (usage, warnings_args): s/YACC/Yacc/.
 
diff --git a/data/bison.m4 b/data/bison.m4
index 2b4e504..384f875 100644
--- a/data/bison.m4
+++ b/data/bison.m4
@@ -668,9 +668,10 @@ m4_define([b4_percent_define_default],
 # b4_percent_define_if_define(VARIABLE)
 # -------------------------------------
 # Define b4_VARIABLE_if that executes its $1 or $2 depending whether
-# VARIABLE was %defined.  The character `.' in VARIABLE is mapped to `_'.
+# VARIABLE was %defined.  The characters `.' and `-' in VARIABLE are mapped
+# to `_'.
 m4_define([b4_percent_define_if_define_],
-[m4_define(m4_bpatsubst([b4_$1_if], [[.]], [_]),
+[m4_define(m4_bpatsubst([b4_$1_if], [[-.]], [_]),
            [b4_percent_define_flag_if([$1], [$2], [$3])])])
 m4_define([b4_percent_define_if_define],
 [b4_percent_define_default([[$1]], [[false]])
diff --git a/doc/bison.texinfo b/doc/bison.texinfo
index fbe9ac9..a3a85a2 100644
--- a/doc/bison.texinfo
+++ b/doc/bison.texinfo
@@ -3053,8 +3053,12 @@ A @dfn{nonterminal symbol} stands for a class of 
syntactically
 equivalent groupings.  The symbol name is used in writing grammar rules.
 By convention, it should be all lower case.
 
-Symbol names can contain letters, digits (not at the beginning),
-underscores and periods.  Periods make sense only in nonterminals.
+Symbol names can contain letters, underscores, period, and (not at the
+beginning) digits and dashes.  Dashes in symbol names are a GNU
+extension, incompatible with @acronym{POSIX} Yacc.  Terminal symbols
+that contain periods or dashes make little sense: since they are not
+valid symbols (in most programming languages) they are not exported as
+token names.
 
 There are three ways of writing terminal symbols in the grammar:
 
diff --git a/src/complain.c b/src/complain.c
index 2c26c4e..4cc35c8 100644
--- a/src/complain.c
+++ b/src/complain.c
@@ -1,6 +1,6 @@
 /* Declaration for error-reporting function for Bison.
 
-   Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006
+   Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2009
    Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -120,6 +120,27 @@ complain (const char *message, ...)
 }
 
 
+/*--------------------------------------------------------------.
+| An incompatibility with POSIX Yacc: mapped either to warn* or |
+| complain* depending on yacc_flag.                             |
+`--------------------------------------------------------------*/
+
+void
+yacc_at (location loc, const char *message, ...)
+{
+  if (yacc_flag)
+    {
+      ERROR_MESSAGE (&loc, NULL, message);
+      complaint_issued = true;
+    }
+  else if (warnings_flag & warnings_yacc)
+    {
+      set_warning_issued ();
+      ERROR_MESSAGE (&loc, _("warning"), message);
+    }
+}
+
+
 /*-------------------------------------------------.
 | A severe error has occurred, we cannot proceed.  |
 `-------------------------------------------------*/
diff --git a/src/complain.h b/src/complain.h
index a633613..89cdd91 100644
--- a/src/complain.h
+++ b/src/complain.h
@@ -1,5 +1,5 @@
 /* Declaration for error-reporting function for Bison.
-   Copyright (C) 2000, 2001, 2002, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2002, 2006, 2009 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -39,6 +39,13 @@ void complain (char const *format, ...)
 void complain_at (location loc, char const *format, ...)
   __attribute__ ((__format__ (__printf__, 2, 3)));
 
+/** An incompatibility with POSIX Yacc: mapped either to warn* or
+    complain* depending on yacc_flag. */
+
+void yacc_at (location loc, char const *format, ...)
+  __attribute__ ((__format__ (__printf__, 2, 3)));
+
+
 /** A fatal error, causing immediate exit.  */
 
 void fatal (char const *format, ...)
diff --git a/src/output.c b/src/output.c
index 1220446..0a08fc4 100644
--- a/src/output.c
+++ b/src/output.c
@@ -490,9 +490,11 @@ token_definitions_output (FILE *out)
       if (sym->tag[0] == '\'' || sym->tag[0] == '\"')
        continue;
 
-      /* Don't #define nonliteral tokens whose names contain periods
-        or '$' (as does the default value of the EOF token).  */
-      if (strchr (sym->tag, '.') || strchr (sym->tag, '$'))
+      /* Don't #define nonliteral tokens whose names contain periods,
+         dashes or '$' (as does the default value of the EOF token).  */
+      if (strchr (sym->tag, '.')
+          || strchr (sym->tag, '-')
+          || strchr (sym->tag, '$'))
        continue;
 
       fprintf (out, "%s[[[%s]], %d]",
diff --git a/src/parse-gram.y b/src/parse-gram.y
index 20dee8c..caa3d30 100644
--- a/src/parse-gram.y
+++ b/src/parse-gram.y
@@ -535,15 +535,12 @@ rhs:
 
 variable:
   ID
-| STRING { $$ = uniqstr_new ($1); } /* deprecated and not M4-friendly */
+| STRING { $$ = uniqstr_new ($1); }
 ;
 
 /* Some content or empty by default. */
 content.opt:
-  /* Nothing. */
-    {
-      $$ = "";
-    }
+  /* Nothing. */   { $$ = ""; }
 | STRING
 ;
 
diff --git a/src/scan-gram.l b/src/scan-gram.l
index 478d096..bc7592e 100644
--- a/src/scan-gram.l
+++ b/src/scan-gram.l
@@ -99,8 +99,8 @@ static void unexpected_newline (boundary, char const *);
 %x SC_STRING SC_CHARACTER
 
 letter   [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
-id       {letter}({letter}|[0-9])*
-directive %{letter}({letter}|[0-9]|-)*
+id       {letter}({letter}|[0-9]|-)*
+directive %{id}
 int      [0-9]+
 
 /* POSIX says that a tag must be both an id and a C union member, but
@@ -411,7 +411,7 @@ splice       (\\[ \f\t\v]*\n)*
     unexpected_eof (token_start, "'");
     STRING_FINISH;
     loc->start = token_start;
-    if (strlen(last_string) > 1)
+    if (strlen (last_string) > 1)
       val->character = last_string[1];
     else
       val->character = last_string[0];
diff --git a/src/symtab.c b/src/symtab.c
index b65bdd4..c956e72 100644
--- a/src/symtab.c
+++ b/src/symtab.c
@@ -1,6 +1,7 @@
 /* Symbol table manager for Bison.
 
-   Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008
+   Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005, 2006, 2007,
+   2008, 2009
    Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -58,6 +59,13 @@ symbol_new (uniqstr tag, location loc)
   symbol *res = xmalloc (sizeof *res);
 
   uniqstr_assert (tag);
+
+  /* If the tag is not a string (starts with a double quote), check
+     that it is valid for Yacc. */
+  if (tag[0] != '\"' && tag[0] != '\'' && strchr (tag, '-'))
+    yacc_at (loc, _("POSIX Yacc forbids dashes in symbol names: %s"),
+             tag);
+
   res->tag = tag;
   res->location = loc;
 
-- 
1.6.2.2


Reply via email to