From c3e9f08f93bc8bbabcd4f4093e52ad8f8b5454ca Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 15 Jun 2012 14:21:16 +0200 Subject: [PATCH] skeletons: use header guards. * data/glr.c, data/glr.cc, data/yacc.c: here. * NEWS: Document it. --- NEWS | 15 ++++++++--- data/glr.c | 23 +++++++---------- data/glr.cc | 11 +++----- data/yacc.c | 73 +++++++++++++++++++++++++++++++++-------------------- 4 files changed, 70 insertions(+), 52 deletions(-) diff --git a/NEWS b/NEWS index fd51b61b..118aae38 100644 --- a/NEWS +++ b/NEWS @@ -8,14 +8,23 @@ GNU Bison NEWS and remove the definition of yystype (removal announced since Bison 1.875). -** Changes in regular C parsers (yacc.c): - -*** The generated header is included +** The generated header is included (yacc.c) Instead of duplicating the content of the generated header (definition of YYSTYPE, yyltype etc.), the generated parser now includes it, as was already the case for GLR or C++ parsers. +** Header guards (yacc.c, glr.c, glr.cc) + + The generated headers are now guarded, as is already the case for C++ + parsers (lalr1.cc). For intance, with --defines=foo.h: + + #ifndef YY_FOO_H + # define YY_FOO_H + ... + #endif /* !YY_FOO_H */ + + * Noteworthy changes in release 2.5.1 (2012-06-05) [stable] ** Future changes: diff --git a/data/glr.c b/data/glr.c index 223aa1e9..d1d61fe6 100644 --- a/data/glr.c +++ b/data/glr.c @@ -166,6 +166,7 @@ m4_define([b4_shared_declarations], [b4_percent_code_get([[requires]])[ ]b4_token_enums(b4_tokens)[ ]b4_declare_yylstype[ +]b4_c_ansi_function_decl(b4_prefix[parse], [int], b4_parse_param)[ ]b4_percent_code_get([[provides]])[]dnl ]) @@ -472,9 +473,6 @@ static const ]b4_int_type_for([b4_stos])[ yystos[] = }; -/* Prevent warning if -Wmissing-prototypes. */ -]b4_c_ansi_function_decl([yyparse], [int], b4_parse_param)[ - /* Error token number */ #define YYTERROR 1 @@ -2637,15 +2635,12 @@ m4_if(b4_skeleton, ["glr.c"], [b4_defines_if( [@output(b4_spec_defines_file@)@ b4_copyright([Skeleton interface for Bison GLR parsers in C], - [2002-2012]) - -b4_shared_declarations - -b4_pure_if([], -[[extern YYSTYPE ]b4_prefix[lval;]]) - -b4_locations_if([b4_pure_if([], -[extern YYLTYPE ]b4_prefix[lloc;]) -]) -])]) + [2002-2012])[ + +]b4_cpp_guard_open([b4_spec_defines_file])[ +]b4_shared_declarations[ +]b4_pure_if([], [[extern YYSTYPE ]b4_prefix[lval; +]b4_locations_if([[extern YYLTYPE ]b4_prefix[lloc;]])])[ +]b4_cpp_guard_close([b4_spec_defines_file])[ +]])]) m4_divert_pop(0) diff --git a/data/glr.cc b/data/glr.cc index d4f21adc..0bc1f9fa 100644 --- a/data/glr.cc +++ b/data/glr.cc @@ -230,8 +230,7 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++], /* C++ GLR 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]])[ @@ -362,8 +361,6 @@ b4_percent_define_flag_if([[global_tokens_and_yystype]], #endif ]b4_namespace_close[ - -]b4_percent_code_get([[provides]])[]dnl - -[#endif /* ! defined PARSER_HEADER_H */] -m4_divert_pop(0) +]b4_percent_code_get([[provides]])[ +]b4_cpp_guard_close([b4_spec_defines_file])[ +]m4_divert_pop(0) diff --git a/data/yacc.c b/data/yacc.c index d5000da0..7f73c26d 100644 --- a/data/yacc.c +++ b/data/yacc.c @@ -225,18 +225,10 @@ m4_define([b4_declare_parser_state_variables], [b4_pure_if([[ YYSIZE_T yyes_capacity;]])]) -# b4_shared_declarations -# ---------------------- -# Declaration that might either go into the header (if --defines) -# or open coded in the parser body. -m4_define([b4_shared_declarations], -[b4_percent_code_get([[requires]])[ -]b4_token_enums_defines(b4_tokens)[ -]b4_declare_yylstype[ -]b4_push_if([[ -#ifndef YYPUSH_DECLS -# define YYPUSH_DECLS -typedef struct ]b4_prefix[pstate ]b4_prefix[pstate; +# b4_declare_yyparse_push_ +# ------------------------ +m4_define([b4_declare_yyparse_push_], +[[typedef struct ]b4_prefix[pstate ]b4_prefix[pstate; enum { YYPUSH_MORE = 4 }; ]b4_pull_if([b4_c_function_decl([b4_prefix[parse]], [[int]], b4_parse_param) ])b4_c_function_decl([b4_prefix[push_parse]], [[int]], @@ -251,10 +243,40 @@ b4_pull_if([b4_c_function_decl([b4_prefix[pull_parse]], [[int]], b4_c_function_decl([b4_prefix[pstate_new]], [b4_prefix[pstate *]], [[[void]], []]) b4_c_function_decl([b4_prefix[pstate_delete]], [[void]], - [[b4_prefix[pstate *yyps]], [[yyps]]])[ -#endif -]]) -b4_percent_code_get([[provides]])[]dnl + [[b4_prefix[pstate *yyps]], [[yyps]]])dnl +]) + +# b4_declare_yyparse_ +# ------------------- +# When not the push parser. +m4_define([b4_declare_yyparse_], +[[#ifdef YYPARSE_PARAM +]b4_c_function_decl(b4_prefix[parse], [int], + [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[ +#else /* ! YYPARSE_PARAM */ +]b4_c_function_decl(b4_prefix[parse], [int], b4_parse_param)[ +#endif /* ! YYPARSE_PARAM */]dnl +]) + + +# b4_declare_yyparse +# ------------------ +m4_define([b4_declare_yyparse], +[b4_push_if([b4_declare_yyparse_push_], + [b4_declare_yyparse_])[]dnl +]) + + +# b4_shared_declarations +# ---------------------- +# Declaration that might either go into the header (if --defines) +# or open coded in the parser body. +m4_define([b4_shared_declarations], +[b4_percent_code_get([[requires]])[ +]b4_token_enums_defines(b4_tokens)[ +]b4_declare_yylstype[ +]b4_declare_yyparse[ +]b4_percent_code_get([[provides]])[]dnl ]) ## -------------- ## @@ -1373,20 +1395,12 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, } #endif /* YYERROR_VERBOSE */ -]b4_yydestruct_generate([b4_c_function_def])b4_push_if([], [[ +]b4_yydestruct_generate([b4_c_function_def])[ - -/* Prevent warnings from -Wmissing-prototypes. */ -#ifdef YYPARSE_PARAM -]b4_c_function_decl([yyparse], [int], - [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[ -#else /* ! YYPARSE_PARAM */ -]b4_c_function_decl([yyparse], [int], b4_parse_param)[ -#endif /* ! YYPARSE_PARAM */]])b4_pure_if([], [ +]b4_pure_if([], [ b4_declare_scanner_communication_variables])[]b4_push_if([[ - struct yypstate {]b4_declare_parser_state_variables[ /* Used to determine if this is the first time this instance has @@ -2054,8 +2068,11 @@ b4_defines_if( [@output(b4_spec_defines_file@)@ b4_copyright([Bison interface for Yacc-like parsers in C], [1984, 1989-1990, 2000-2012])[ + +]b4_cpp_guard_open([b4_spec_defines_file])[ ]b4_shared_declarations[ ]b4_pure_if([], [[extern YYSTYPE ]b4_prefix[lval; -]b4_locations_if([[extern YYLTYPE ]b4_prefix[lloc;]])])dnl -])dnl b4_defines_if +]b4_locations_if([[extern YYLTYPE ]b4_prefix[lloc;]])])[ +]b4_cpp_guard_close([b4_spec_defines_file])[ +]])dnl b4_defines_if m4_divert_pop(0) -- 2.45.2