]> git.saurik.com Git - bison.git/commitdiff
c++: compute the header guards.
authorAkim Demaille <akim@lrde.epita.fr>
Mon, 21 May 2012 12:21:51 +0000 (14:21 +0200)
committerAkim Demaille <akim@lrde.epita.fr>
Mon, 21 May 2012 16:15:41 +0000 (18:15 +0200)
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
THANKS
TODO
data/c.m4
data/lalr1.cc
data/location.cc
data/stack.hh

diff --git a/NEWS b/NEWS
index 27c4974adc79a6eb54f842f8e738c743fb936675..4fadf4e5eff5be9dd71d702a95072a6b9b964096 100644 (file)
--- 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.
 
   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 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
 
   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 6d0d89ee0ff70aba5a729d6e0a41bf37ae5d7a1b..e3bf221b365c6c6d388a19b666cc5c70a432b728 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -112,6 +112,7 @@ Tys Lefering              gccbison@gmail.com
 Vin Shelton               acs@alumni.princeton.edu
 W.C.A. Wijngaards         wouter@NLnetLabs.nl
 Wayne Green               wayne@infosavvy.com
 Vin Shelton               acs@alumni.princeton.edu
 W.C.A. Wijngaards         wouter@NLnetLabs.nl
 Wayne Green               wayne@infosavvy.com
+Wei Song                  wsong83@gmail.com
 Wolfgang S. Kechel        wolfgang.kechel@prs.de
 Wolfram Wagner            ww@mpi-sb.mpg.de
 Wwp                       subscript@free.fr
 Wolfgang S. Kechel        wolfgang.kechel@prs.de
 Wolfram Wagner            ww@mpi-sb.mpg.de
 Wwp                       subscript@free.fr
diff --git a/TODO b/TODO
index d86d8d8b588bd588d952900f5af80f12ded78acb..21ef4b9135c8688b82acfac405e7cb5e0f34610b 100644 (file)
--- 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.
 
 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
 
 
 * Yacc.c: CPP Macros
 
index fee006a3d3523eb9389bd4bb35fcd22d6144dced..b49d6dc9378252686199ac3717a1f4fe868538ab 100644 (file)
--- a/data/c.m4
+++ b/data/c.m4
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # 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.  ##
 ## ---------------- ##
 ## ---------------- ##
 ## Identification.  ##
 ## ---------------- ##
index 0fe3aeed40eb35751e25b8bf779922f565850650..4f0b268880d01b16ffa14eca65dcb3b839616993 100644 (file)
@@ -37,7 +37,6 @@ b4_defines_if(
 [@output(b4_spec_defines_file@)@
 b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++],
              [2002-2012])
 [@output(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[
 [
 /**
  ** \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.  */
 
 
 /* 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]])[
 
 
 ]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
  /* 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++],
 ])dnl
 @output(b4_parser_file_name@)@
 b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++],
index 0ee02c28bc938ee6a70bfa2758bf81b3712b0cac..f45f634e20b0dad26e1ea75c9912ec5732aa1855 100644 (file)
@@ -27,8 +27,7 @@ b4_copyright([Positions for Bison parsers in C++],
  ** Define the ]b4_namespace_ref[::position class.
  */
 
  ** 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>
 
 # include <iostream>
 # include <string>
@@ -148,7 +147,7 @@ b4_copyright([Positions for Bison parsers in C++],
   }
 
 ]b4_namespace_close[
   }
 
 ]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])[
 @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.
  */
 
  ** 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>
 
 # include <iostream>
 # include <string>
@@ -295,6 +293,6 @@ b4_copyright([Locations for Bison parsers in C++],
 
 ]b4_namespace_close[
 
 
 ]b4_namespace_close[
 
-#endif // not BISON_LOCATION_HH]
+]b4_cpp_guard_close([b4_dir_prefix[]location.hh])
 m4_divert_pop(0)
 m4_changecom([#])
 m4_divert_pop(0)
 m4_changecom([#])
index 529337740eb5398a9ef7b58d3ba89e6a919c9ac8..ddedc79bef7d25e1415f0f4345043fd8a6b98901 100644 (file)
@@ -30,8 +30,7 @@ b4_copyright([Stack handling for Bison parsers in C++],
  ** Define the ]b4_namespace_ref[::stack class.
  */
 
  ** 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>
 
 
 # include <deque>
 
@@ -119,8 +118,7 @@ b4_copyright([Stack handling for Bison parsers in C++],
   };
 ]b4_namespace_close[
 
   };
 ]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([#])
 m4_divert_pop(0)
 m4_popdef([b4_copyright_years])dnl
 m4_changecom([#])