From 5a05f42ecf104c83508e58f292a962b6ac3d5777 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 27 Sep 2012 09:42:57 +0200 Subject: [PATCH 1/2] minor changes. * NEWS: Word changes. * doc/bison.texi: Spell check. Fix minor issues. * tests/headers.at: Comment and formatting changes. --- NEWS | 2 +- doc/bison.texi | 13 +++++++------ tests/headers.at | 8 +++++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/NEWS b/NEWS index 772a2d51..e8b2d952 100644 --- a/NEWS +++ b/NEWS @@ -14,7 +14,7 @@ GNU Bison NEWS Incorrect definitions of YY_, issued by yacc.c when no parser header is generated, are removed. -** Changes in the format of errors and exceptions output +** Changes in the format of error messages This used to be the format of many error reports: diff --git a/doc/bison.texi b/doc/bison.texi index ad605054..b8a1aa6d 100644 --- a/doc/bison.texi +++ b/doc/bison.texi @@ -5076,7 +5076,7 @@ default location or at the location specified by @var{qualifier}. @deffn {Directive} %debug In the parser implementation file, define the macro @code{YYDEBUG} (or -@code{@var{prefix}DEBUG} with @samp{%define api.prefix @var{prefix}}), see +@code{@var{prefix}DEBUG} with @samp{%define api.prefix @var{prefix}}, see @ref{Multiple Parsers, ,Multiple Parsers in the Same Program}) to 1 if it is not already defined, so that the debugging facilities are compiled. @xref{Tracing, ,Tracing Your Parser}. @@ -8502,8 +8502,8 @@ Prologue}). If the @code{%define} variable @code{api.prefix} is used (@pxref{Multiple Parsers, ,Multiple Parsers in the Same Program}), for instance @samp{%define api.prefix x}, then if @code{CDEBUG} is defined, its value controls the -tracing feature (enabled iff nonzero); otherwise tracing is enabled iff -@code{YYDEBUG} is nonzero. +tracing feature (enabled if and only if nonzero); otherwise tracing is +enabled if and only if @code{YYDEBUG} is nonzero. @item the option @option{-t} (POSIX Yacc compliant) @itemx the option @option{--debug} (Bison extension) @@ -11761,10 +11761,11 @@ London, Department of Computer Science, TR-00-12 (December 2000). @c LocalWords: toString deftypeivar deftypeivarx deftypeop YYParser strictfp @c LocalWords: superclasses boolean getErrorVerbose setErrorVerbose deftypecv @c LocalWords: getDebugStream setDebugStream getDebugLevel setDebugLevel url -@c LocalWords: bisonVersion deftypecvx bisonSkeleton getStartPos getEndPos +@c LocalWords: bisonVersion deftypecvx bisonSkeleton getStartPos getEndPos uint @c LocalWords: getLVal defvar deftypefn deftypefnx gotos msgfmt Corbett LALR's -@c LocalWords: subdirectory Solaris nonassociativity perror schemas Malloy -@c LocalWords: Scannerless ispell american +@c LocalWords: subdirectory Solaris nonassociativity perror schemas Malloy ints +@c LocalWords: Scannerless ispell american ChangeLog smallexample CSTYPE CLTYPE +@c LocalWords: clval CDEBUG cdebug deftypeopx yyterminate @c Local Variables: @c ispell-dictionary: "american" diff --git a/tests/headers.at b/tests/headers.at index cac7fe5f..aea0bc9b 100644 --- a/tests/headers.at +++ b/tests/headers.at @@ -126,8 +126,8 @@ AT_SETUP([Several parsers]) # AT_TEST([PREFIX], [DIRECTIVES]) # ------------------------------- -# Generate and compile to *.o. Make sure there is no YY* nor yy* in -# the header (but YYDEBUG and YYPARSE_PARAM). +# Generate and compile to *.o. Make sure there is no (allowed) YY* +# nor yy* identifiers in the header. m4_pushdef([AT_TEST], [AT_BISON_OPTION_PUSHDEFS([%define api.prefix "$1_" $2]) AT_DATA_GRAMMAR([$1.AT_SKEL_CC_IF([yy], [y])], @@ -161,6 +161,8 @@ exp: ]]) AT_BISON_CHECK([-d -o AT_SKEL_CC_IF([$1.cc $1.yy], [$1.c $1.y])]) + +# Check there is no 'yy' left. # C++ output relies on namespaces and still uses yy a lot. AT_SKEL_CC_IF([], [AT_CHECK([$EGREP yy $1.h], [1])]) @@ -173,8 +175,8 @@ AT_CHECK([[sed -ne 's,/\*[^*]*\*/,,g;s,//.*,,' \ -e '/YY/p' ]$1.AT_SKEL_CC_IF([hh], [h])[ | $EGREP -wv 'YY(PARSE_PARAM|PUSH_MORE(_DEFINED)?)|(defined|if) YYDEBUG']], [1]) -AT_LANG_COMPILE([$1.o]) +AT_LANG_COMPILE([$1.o]) AT_CHECK([[echo "$1" >>expout]]) AT_BISON_OPTION_POPDEFS From c9d5bcc9389ccea013b23eb095dc4a637fadbd42 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 27 Sep 2012 09:43:49 +0200 Subject: [PATCH 2/2] headers: move CPP guards into YY_*_INCLUDED to avoid collisions See . * data/c.m4 (b4_cpp_guard): Prepend YY_ and append _INCLUDED. * tests/headers.at: Adjust. * NEWS, doc/bison.texi: Document. --- NEWS | 11 +++++++++++ data/c.m4 | 2 +- doc/bison.texi | 17 +++++++++++++++++ tests/headers.at | 7 ++++--- 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index e8b2d952..ad5f738e 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,17 @@ GNU Bison NEWS foo.y:5.10-25: result type clash on merge function 'merge': != foo.y:4.13-27: previous declaration +** Header guards (yacc.c, glr.c, glr.cc) + + In order to avoid collisions, the header guards are now + YY___INCLUDED, instead of merely _. + For instance the header generated from + + %define api.prefix "calc" + %defines "lib/parse.h" + + will use YY_CALC_LIB_PARSE_H_INCLUDED as guard. + * Noteworthy changes in release 2.6.2 (2012-08-03) [stable] ** Bug fixes diff --git a/data/c.m4 b/data/c.m4 index ccb4969e..fd2203eb 100644 --- a/data/c.m4 +++ b/data/c.m4 @@ -30,7 +30,7 @@ m4_define([b4_tocpp], # ------------------ # 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])]) +[[YY_]b4_tocpp(m4_defn([b4_prefix])/[$1])[_INCLUDED]]) # b4_cpp_guard_open(FILE) diff --git a/doc/bison.texi b/doc/bison.texi index b8a1aa6d..69836112 100644 --- a/doc/bison.texi +++ b/doc/bison.texi @@ -5124,6 +5124,23 @@ Values, ,Semantic Values of Tokens}. If you have declared @code{%code requires} or @code{%code provides}, the output header also contains their code. @xref{%code Summary}. + +@cindex Header guard +The generated header is protected against multiple inclusions with a C +preprocessor guard: @samp{YY_@var{PREFIX}_@var{FILE}_INCLUDED}, where +@var{PREFIX} and @var{FILE} are the prefix (@pxref{Multiple Parsers, +,Multiple Parsers in the Same Program}) and generated file name turned +uppercase, with each series of non alphanumerical characters converted to a +single underscore. + +For instance with @samp{%define api.prefix "calc"} and @samp{%defines +"lib/parse.h"}, the header will be guarded as follows. +@example +#ifndef YY_CALC_LIB_PARSE_H_INCLUDED +# define YY_CALC_LIB_PARSE_H_INCLUDED +... +#endif /* ! YY_CALC_LIB_PARSE_H_INCLUDED */ +@end example @end deffn @deffn {Directive} %defines @var{defines-file} diff --git a/tests/headers.at b/tests/headers.at index aea0bc9b..0524340e 100644 --- a/tests/headers.at +++ b/tests/headers.at @@ -167,13 +167,14 @@ AT_BISON_CHECK([-d -o AT_SKEL_CC_IF([$1.cc $1.yy], [$1.c $1.y])]) AT_SKEL_CC_IF([], [AT_CHECK([$EGREP yy $1.h], [1])]) -# Ignore comments. Ignore YYPARSE_PARAM (obsolete) and -# YYPUSH_MORE(_DEFINED)? (whose definition is constant). +# Check there is not 'YY' left. +# Ignore comments, YYPARSE_PARAM (obsolete), YYPUSH_MORE(_DEFINED)? +# (constant definition), YY_\w+_INCLUDED (header guards). # # YYDEBUG (not renamed) can be read, but not changed. AT_CHECK([[sed -ne 's,/\*[^*]*\*/,,g;s,//.*,,' \ -e '/YY/p' ]$1.AT_SKEL_CC_IF([hh], [h])[ | - $EGREP -wv 'YY(PARSE_PARAM|PUSH_MORE(_DEFINED)?)|(defined|if) YYDEBUG']], + $EGREP -wv 'YY(PARSE_PARAM|PUSH_MORE(_DEFINED)?|_[0-9A-Z_]+_INCLUDED)|(defined|if) YYDEBUG']], [1]) AT_LANG_COMPILE([$1.o])