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
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
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
# 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. ##
## ---------------- ##
[@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[
/* 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]])[
/* 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++],
** 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>
}
]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])[
** 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>
]b4_namespace_close[
-#endif // not BISON_LOCATION_HH]
+]b4_cpp_guard_close([b4_dir_prefix[]location.hh])
m4_divert_pop(0)
m4_changecom([#])
** 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>
};
]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([#])