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.
This commit is contained in:
Akim Demaille
2012-05-21 14:21:51 +02:00
parent a19728cbb5
commit 22172d4731
7 changed files with 63 additions and 23 deletions

27
NEWS
View File

@@ -26,12 +26,35 @@ Bison News
The Java parser no longer throws ArrayIndexOutOfBoundsException if the The Java parser no longer throws ArrayIndexOutOfBoundsException if the
first token leads to a syntax error. Some minor clean ups. 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 C and C++ parsers use "nullptr" instead of "0" when __cplusplus is 201103L
or higher. 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) The position and location constructors (and their initialize methods)
accept new arguments for line and column. Several issues in the accept new arguments for line and column. Several issues in the

1
THANKS
View File

@@ -112,6 +112,7 @@ Tys Lefering gccbison@gmail.com
Vin Shelton acs@alumni.princeton.edu Vin Shelton acs@alumni.princeton.edu
W.C.A. Wijngaards wouter@NLnetLabs.nl W.C.A. Wijngaards wouter@NLnetLabs.nl
Wayne Green wayne@infosavvy.com Wayne Green wayne@infosavvy.com
Wei Song wsong83@gmail.com
Wolfgang S. Kechel wolfgang.kechel@prs.de Wolfgang S. Kechel wolfgang.kechel@prs.de
Wolfram Wagner ww@mpi-sb.mpg.de Wolfram Wagner ww@mpi-sb.mpg.de
Wwp subscript@free.fr Wwp subscript@free.fr

4
TODO
View File

@@ -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 The code bw glr.c and yacc.c is really alike, we can certainly factor
some parts. 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

View File

@@ -17,6 +17,33 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # 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. ##
## ---------------- ## ## ---------------- ##

View File

@@ -37,7 +37,6 @@ b4_defines_if(
[@output(b4_spec_defines_file@)@ [@output(b4_spec_defines_file@)@
b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++], b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++],
[2002-2012]) [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 ]b4_cpp_guard_open([b4_spec_defines_file])[
# define PARSER_HEADER_H
]b4_percent_code_get([[requires]])[ ]b4_percent_code_get([[requires]])[
@@ -283,10 +281,9 @@ b4_user_stype
/* Redirection for backward compatibility. */ /* Redirection for backward compatibility. */
# define YYSTYPE b4_namespace_ref::b4_parser_class_name::semantic_type # define YYSTYPE b4_namespace_ref::b4_parser_class_name::semantic_type
#endif #endif
]) ])[
b4_percent_code_get([[provides]])[]dnl ]b4_percent_code_get([[provides]])[
]b4_cpp_guard_close([b4_spec_defines_file])
[#endif /* ! defined PARSER_HEADER_H */]
])dnl ])dnl
@output(b4_parser_file_name@)@ @output(b4_parser_file_name@)@
b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++], b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++],

View 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 ]b4_cpp_guard_open([b4_dir_prefix[]position.hh])[
# define BISON_POSITION_HH
# include <iostream> # include <iostream>
# include <string> # 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@)@ @output(b4_dir_prefix[]location.hh@)@
b4_copyright([Locations for Bison parsers in C++], b4_copyright([Locations for Bison parsers in C++],
[2002-2007, 2009-2012])[ [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 ]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[
# define BISON_LOCATION_HH
# include <iostream> # include <iostream>
# include <string> # 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_divert_pop(0)
m4_changecom([#]) m4_changecom([#])

View 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 ]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[
# define BISON_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_divert_pop(0)
m4_popdef([b4_copyright_years])dnl m4_popdef([b4_copyright_years])dnl
m4_changecom([#]) m4_changecom([#])