From 22172d473180c53755290f13ebd2d53e12e74fe0 Mon Sep 17 00:00:00 2001 From: Akim Demaille 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, . * 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 27c4974a..4fadf4e5 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 6d0d89ee..e3bf221b 100644 --- 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 +Wei Song wsong83@gmail.com 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 d86d8d8b..21ef4b91 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 fee006a3..b49d6dc9 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 . + +# 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 0fe3aeed..4f0b2688 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -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]) -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 0ee02c28..f45f634e 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 # include @@ -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 # include @@ -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 52933774..ddedc79b 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 @@ -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([#]) -- 2.45.2