help-bison
[Top][All Lists]
Advanced

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

RFC: header file guards conflict


From: Akim Demaille
Subject: RFC: header file guards conflict
Date: Mon, 21 May 2012 18:16:57 +0200

Le 21 mai 2012 à 14:56, Akim Demaille a écrit :

> This is the patch that really computes the header guards.
> 
>> From eb76fadde9c5a3b23dc6761ddd4d267a6e7c3965 Mon Sep 17 00:00:00 2001
> From: Akim Demaille <address@hidden>
> Date: Mon, 21 May 2012 14:21:51 +0200
> Subject: [PATCH 4/4] c++: compute the header guards.

On second thought, I see no good reason to do this from
C, m4 can do it.  I first went for C since that's the
way we handle @basename, but since we escape dangerous
characters (equivalent to Autoconf's quadrigraphs), I
fail to see the need.  I could not have it fail, even
with directory names such as [(".

Also, instead of mapping every single non-alnum to _,
I now collapse such series into a single _.  So, for
instance:

/**
 ** \file ../../../../examples/calc++/calc++-parser.hh
 ** Define the yy::parser class.
 */

that had:

+#ifndef YY_____________EXAMPLES_CALC___CALC___PARSER_HH
+# define YY_____________EXAMPLES_CALC___CALC___PARSER_HH

in the first version of the patch, now has:

+#ifndef YY_EXAMPLES_CALC_CALC_PARSER_HH
+# define YY_EXAMPLES_CALC_CALC_PARSER_HH


From 22172d473180c53755290f13ebd2d53e12e74fe0 Mon Sep 17 00:00:00 2001
From: Akim Demaille <address@hidden>
Date: Mon, 21 May 2012 14:21:51 +0200
Subject: [PATCH] c++: compute the header guards.

This is a frequent request.  Recently pointed out by Wei Song,
<http://lists.gnu.org/archive/html/help-bison/2012-05/msg00002.html>.

* data/c.m4 (b4_tocpp, b4_cpp_guard, b4_cpp_guard_open)
(b4_cpp_guard_close): New.
* data/lalr1.cc, data/location.cc, data/stack.hh: Use them.
* TODO (Header Guards): Move to...
* NEWS: here.
Formatting changes.
---
 NEWS             |   27 +++++++++++++++++++++++++--
 THANKS           |    1 +
 TODO             |    4 ----
 data/c.m4        |   27 +++++++++++++++++++++++++++
 data/lalr1.cc    |   11 ++++-------
 data/location.cc |   10 ++++------
 data/stack.hh    |    6 ++----
 7 files changed, 63 insertions(+), 23 deletions(-)

diff --git a/NEWS b/NEWS
index 27c4974..4fadf4e 100644
--- a/NEWS
+++ b/NEWS
@@ -26,12 +26,35 @@ Bison News
   The Java parser no longer throws ArrayIndexOutOfBoundsException if the
   first token leads to a syntax error.  Some minor clean ups.
 
-** C++11 compatibility:
+** Changes for C++:
+
+*** C++11 compatibility:
 
   C and C++ parsers use "nullptr" instead of "0" when __cplusplus is 201103L
   or higher.
 
-** C++ locations:
+*** Header guards
+
+  The header files such as "parser.hh", "location.hh", etc. used a constant
+  name for preprocessor guards, for instance:
+
+  #ifndef BISON_LOCATION_HH
+  # define BISON_LOCATION_HH
+  ...
+  #endif // !BISON_LOCATION_HH
+
+  The inclusion guard is now computed from "PREFIX/FILE-NAME", where lower
+  case characters are converted to upper case, and series of
+  non-alphanumerical characters are converted to an underscore.
+
+  With "bison -o lang++/parser.cc", "location.hh" would now include:
+
+  #ifndef YY_LANG_LOCATION_HH
+  # define YY_LANG_LOCATION_HH
+  ...
+  #endif // !YY_LANG_LOCATION_HH
+
+*** C++ locations:
 
   The position and location constructors (and their initialize methods)
   accept new arguments for line and column.  Several issues in the
diff --git a/THANKS b/THANKS
index 6d0d89e..e3bf221 100644
--- a/THANKS
+++ b/THANKS
@@ -112,6 +112,7 @@ Tys Lefering              address@hidden
 Vin Shelton               address@hidden
 W.C.A. Wijngaards         address@hidden
 Wayne Green               address@hidden
+Wei Song                  address@hidden
 Wolfgang S. Kechel        address@hidden
 Wolfram Wagner            address@hidden
 Wwp                       address@hidden
diff --git a/TODO b/TODO
index d86d8d8..21ef4b9 100644
--- a/TODO
+++ b/TODO
@@ -125,10 +125,6 @@ we do the same in yacc.c.
 The code bw glr.c and yacc.c is really alike, we can certainly factor
 some parts.
 
-* Header guards
-
-From François: should we keep the directory part in the CPP guard?
-
 
 * Yacc.c: CPP Macros
 
diff --git a/data/c.m4 b/data/c.m4
index fee006a..b49d6dc 100644
--- a/data/c.m4
+++ b/data/c.m4
@@ -17,6 +17,33 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+
+# b4_tocpp(STRING)
+# ----------------
+# Convert STRING into a valid C macro name.
+m4_define([b4_tocpp],
+[m4_toupper(m4_bpatsubst(m4_quote($1), [[^a-zA-Z0-9]+], [_]))])
+
+
+# b4_cpp_guard(FILE)
+# ------------------
+# A valid C macro name to use as a CPP header guard for FILE.
+m4_define([b4_cpp_guard],
+[b4_tocpp(m4_defn([b4_prefix])/[$1])])
+
+
+# b4_cpp_guard_open(FILE)
+# b4_cpp_guard_close(FILE)
+# ------------------------
+# Open/close CPP inclusion guards for FILE.
+m4_define([b4_cpp_guard_open],
+[#ifndef b4_cpp_guard([$1])
+# define b4_cpp_guard([$1])])
+
+m4_define([b4_cpp_guard_close],
+[#endif b4_comment([!b4_cpp_guard([$1])])])
+
+
 ## ---------------- ##
 ## Identification.  ##
 ## ---------------- ##
diff --git a/data/lalr1.cc b/data/lalr1.cc
index 0fe3aee..4f0b268 100644
--- a/data/lalr1.cc
+++ b/data/lalr1.cc
@@ -37,7 +37,6 @@ b4_defines_if(
 address@hidden(b4_spec_defines_file@)@
 b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++],
              [2002-2012])
-dnl FIXME: This is wrong, we want computed header guards.
 [
 /**
  ** \file ]b4_spec_defines_file[
@@ -46,8 +45,7 @@ dnl FIXME: This is wrong, we want computed header guards.
 
 /* C++ LALR(1) parser skeleton written by Akim Demaille.  */
 
-#ifndef PARSER_HEADER_H
-# define PARSER_HEADER_H
+]b4_cpp_guard_open([b4_spec_defines_file])[
 
 ]b4_percent_code_get([[requires]])[
 
@@ -283,10 +281,9 @@ b4_user_stype
  /* Redirection for backward compatibility.  */
 # define YYSTYPE b4_namespace_ref::b4_parser_class_name::semantic_type
 #endif
-])
-b4_percent_code_get([[provides]])[]dnl
-
-[#endif /* ! defined PARSER_HEADER_H */]
+])[
+]b4_percent_code_get([[provides]])[
+]b4_cpp_guard_close([b4_spec_defines_file])
 ])dnl
 @output(b4_parser_file_name@)@
 b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++],
diff --git a/data/location.cc b/data/location.cc
index 0ee02c2..f45f634 100644
--- a/data/location.cc
+++ b/data/location.cc
@@ -27,8 +27,7 @@ b4_copyright([Positions for Bison parsers in C++],
  ** Define the ]b4_namespace_ref[::position class.
  */
 
-#ifndef BISON_POSITION_HH
-# define BISON_POSITION_HH
+]b4_cpp_guard_open([b4_dir_prefix[]position.hh])[
 
 # include <iostream>
 # include <string>
@@ -148,7 +147,7 @@ b4_copyright([Positions for Bison parsers in C++],
   }
 
 ]b4_namespace_close[
-#endif // not BISON_POSITION_HH]
+]b4_cpp_guard_close([b4_dir_prefix[]position.hh])
 @output(b4_dir_prefix[]location.hh@)@
 b4_copyright([Locations for Bison parsers in C++],
              [2002-2007, 2009-2012])[
@@ -158,8 +157,7 @@ b4_copyright([Locations for Bison parsers in C++],
  ** Define the ]b4_namespace_ref[::location class.
  */
 
-#ifndef BISON_LOCATION_HH
-# define BISON_LOCATION_HH
+]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[
 
 # include <iostream>
 # include <string>
@@ -295,6 +293,6 @@ b4_copyright([Locations for Bison parsers in C++],
 
 ]b4_namespace_close[
 
-#endif // not BISON_LOCATION_HH]
+]b4_cpp_guard_close([b4_dir_prefix[]location.hh])
 m4_divert_pop(0)
 m4_changecom([#])
diff --git a/data/stack.hh b/data/stack.hh
index 5293377..ddedc79 100644
--- a/data/stack.hh
+++ b/data/stack.hh
@@ -30,8 +30,7 @@ b4_copyright([Stack handling for Bison parsers in C++],
  ** Define the ]b4_namespace_ref[::stack class.
  */
 
-#ifndef BISON_STACK_HH
-# define BISON_STACK_HH
+]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[
 
 # include <deque>
 
@@ -119,8 +118,7 @@ b4_copyright([Stack handling for Bison parsers in C++],
   };
 ]b4_namespace_close[
 
-#endif // not BISON_STACK_HH[]dnl
-]
+]b4_cpp_guard_close([b4_dir_prefix[]stack.hh])
 m4_divert_pop(0)
 m4_popdef([b4_copyright_years])dnl
 m4_changecom([#])
-- 
1.7.10.2





reply via email to

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