mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-21 10:13:03 +00:00
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:
27
NEWS
27
NEWS
@@ -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
1
THANKS
@@ -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
4
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
|
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
|
||||||
|
|
||||||
|
|||||||
27
data/c.m4
27
data/c.m4
@@ -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. ##
|
||||||
## ---------------- ##
|
## ---------------- ##
|
||||||
|
|||||||
@@ -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++],
|
||||||
|
|||||||
@@ -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([#])
|
||||||
|
|||||||
@@ -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([#])
|
||||||
|
|||||||
Reference in New Issue
Block a user