From e4c0985b5cf193831a3b7fe2aab792cab3ffe6e2 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 15 Aug 2012 08:46:54 +0200 Subject: [PATCH] glr.cc: %defines is no longer mandatory * data/glr.cc: No longer require %defines. When it is not given, define the position and location classes instead of including their headers. (b4_shared_declarations): Use the original parse-params. * data/glr.c (b4_shared_declarations): Define only if undefined. * tests/actions.at, tests/calc.at: No longer force the use of %defines for glr.cc. * NEWS: Doc it. --- NEWS | 10 ++++----- TODO | 3 --- data/glr.c | 7 +++--- data/glr.cc | 57 +++++++++++++++++++++++++++--------------------- tests/actions.at | 1 - tests/calc.at | 10 ++++----- 6 files changed, 46 insertions(+), 42 deletions(-) diff --git a/NEWS b/NEWS index fd749368..8f52f80c 100644 --- a/NEWS +++ b/NEWS @@ -85,13 +85,13 @@ GNU Bison NEWS ** C++ skeletons improvements -*** parser header (%defines) is no longer mandatory (lalr1.cc) +*** The parser header is no longer mandatory (lalr1.cc, glr.cc) - In which case, if needed, the support classes are defined in the generated - parser, instead of additional files (location.hh, position.hh and - stack.hh). + Using %defines is now optional. Without it, the needed support classes + are defined in the generated parser, instead of additional files (such as + location.hh, position.hh and stack.hh). -*** locations are no longer mandatory (lalr1.cc, glr.cc) +*** Locations are no longer mandatory (lalr1.cc, glr.cc) Both lalr1.cc and glr.cc no longer require %location. diff --git a/TODO b/TODO index 2907d992..25fce499 100644 --- a/TODO +++ b/TODO @@ -7,9 +7,6 @@ sure to check that the initial-action is performed once per parsing. b4_shared_declarations is no longer what it is. Make it b4_parser_declaration for instance. -** glr.cc: %defines -it should not be mandatory. - ** $ and others in epilogue A stray $ is a warning in the actions, but an error in the epilogue. IMHO, it should not even be a warning in the epilogue. diff --git a/data/glr.c b/data/glr.c index ce81510b..46eaccc7 100644 --- a/data/glr.c +++ b/data/glr.c @@ -172,8 +172,9 @@ m4_define([b4_rhs_location], # 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], +# or open coded in the parser body. glr.cc has its own definition. +m4_if(b4_skeleton, ["glr.c"], +[m4_define([b4_shared_declarations], [b4_declare_yydebug[ ]b4_percent_code_get([[requires]])[ ]b4_token_enums[ @@ -181,7 +182,7 @@ m4_define([b4_shared_declarations], ]b4_function_declare(b4_prefix[parse], [int], b4_parse_param)[ ]b4_percent_code_get([[provides]])[]dnl ]) - +]) ## -------------- ## ## Output files. ## diff --git a/data/glr.cc b/data/glr.cc index 56edcb21..8f0027ee 100644 --- a/data/glr.cc +++ b/data/glr.cc @@ -46,13 +46,9 @@ # We require a pure interface. m4_define([b4_pure_flag], [1]) -# The header is mandatory. -b4_defines_if([], - [b4_fatal([b4_skeleton[: using %%defines is mandatory]])]) - m4_include(b4_pkgdatadir/[c++.m4]) -b4_percent_define_ifdef([[location_type]], [], - [m4_include(b4_pkgdatadir/[location.cc])]) +b4_locations_if([b4_percent_define_ifdef([[location_type]], [], + [m4_include(b4_pkgdatadir/[location.cc])])]) m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])]) @@ -208,37 +204,32 @@ m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl #endif ]m4_popdef([b4_parse_param])dnl -b4_namespace_close]) - - -# Let glr.c believe that the user arguments include the parser itself. -m4_ifset([b4_parse_param], -[m4_pushdef([b4_parse_param], - [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]],] -m4_defn([b4_parse_param]))], -[m4_pushdef([b4_parse_param], - [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]]]) +b4_namespace_close ]) -m4_include(b4_pkgdatadir/[glr.c]) -m4_popdef([b4_parse_param]) - # 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]])[ +[dnl In this section, the parse params are the original parse_params. +m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl +b4_percent_code_get([[requires]])[ #include #include -#include -]b4_percent_define_ifdef([[location_type]], [], - [[#include "location.hh"]])[ +#include ]b4_defines_if([ +b4_locations_if([b4_percent_define_ifdef([[location_type]], [], + [[#include "location.hh"]])])])[ ]b4_YYDEBUG_define[ ]b4_namespace_open[ +]b4_defines_if([], +[b4_locations_if([b4_percent_define_ifdef([[location_type]], [], + [b4_position_define +b4_location_define])])])[ + /// A Bison parser. class ]b4_parser_class_name[ { @@ -308,9 +299,12 @@ b4_percent_define_flag_if([[global_tokens_and_yystype]], ]b4_namespace_close[ ]b4_percent_code_get([[provides]])[ -]]) +]m4_popdef([b4_parse_param])dnl +]) -m4_divert_push(0) +b4_defines_if( +[m4_changecom()dnl +m4_divert_push(0)dnl @output(b4_spec_defines_file@)@ b4_copyright([Skeleton interface for Bison GLR parsers in C++], [2002-2012])[ @@ -321,3 +315,16 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++], ]b4_shared_declarations[ ]b4_cpp_guard_close([b4_spec_defines_file])[ ]m4_divert_pop(0) +m4_changecom[#])]) + +# Let glr.c (and b4_shared_declarations) believe that the user +# arguments include the parser itself. +m4_ifset([b4_parse_param], +[m4_pushdef([b4_parse_param], + [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]],] +m4_defn([b4_parse_param]))], +[m4_pushdef([b4_parse_param], + [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]]]) +]) +m4_include(b4_pkgdatadir/[glr.c]) +m4_popdef([b4_parse_param]) diff --git a/tests/actions.at b/tests/actions.at index dd71c3b4..c1af5eaa 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -1278,7 +1278,6 @@ AT_BISON_OPTION_PUSHDEFS([%skeleton "$1"]) AT_DATA_GRAMMAR([[input.y]], [[%skeleton "$1" -%defines // FIXME: Mandated by glr.cc. %debug %code requires { diff --git a/tests/calc.at b/tests/calc.at index 03530a0c..f785d6f0 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -736,19 +736,19 @@ AT_CHECK_CALC_LALR1_CC([%defines %locations %pure-parser %define parse.error ver AT_BANNER([[Simple GLR C++ Calculator.]]) # Again, we try also using %skeleton. -AT_CHECK_CALC([%skeleton "glr.cc" %defines]) +AT_CHECK_CALC([%skeleton "glr.cc"]) # AT_CHECK_CALC_GLR_CC([BISON-OPTIONS]) # ------------------------------------- # Start a testing chunk which compiles `calc' grammar with # the GLR C++ skeleton, and performs several tests over the parser. m4_define([AT_CHECK_CALC_GLR_CC], -[AT_CHECK_CALC([%language "C++" %glr-parser %defines %locations] $@)]) +[AT_CHECK_CALC([%language "C++" %glr-parser] $@)]) AT_CHECK_CALC_GLR_CC([]) AT_CHECK_CALC_GLR_CC([%locations]) AT_CHECK_CALC_GLR_CC([%locations %define location_type Span]) -AT_CHECK_CALC_GLR_CC([%define parse.error verbose %name-prefix "calc" %verbose %yacc]) +AT_CHECK_CALC_GLR_CC([%defines %define parse.error verbose %name-prefix "calc" %verbose %yacc]) AT_CHECK_CALC_GLR_CC([%define parse.error verbose %define api.prefix "calc" %verbose %yacc]) AT_CHECK_CALC_GLR_CC([%debug]) @@ -757,5 +757,5 @@ AT_CHECK_CALC_GLR_CC([%define parse.error verbose %debug %name-prefix "calc" %ve AT_CHECK_CALC_GLR_CC([%pure-parser %define parse.error verbose %debug %name-prefix "calc" %verbose %yacc]) AT_CHECK_CALC_GLR_CC([%pure-parser %define parse.error verbose %debug %name-prefix "calc" %define api.tokens.prefix "TOK_" %verbose %yacc]) -AT_CHECK_CALC_GLR_CC([%locations %pure-parser %define parse.error verbose %debug %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} {int *count}]) -AT_CHECK_CALC_GLR_CC([%locations %pure-parser %define parse.error verbose %debug %define api.prefix "calc" %verbose %yacc %parse-param {semantic_value *result} {int *count}]) +AT_CHECK_CALC_GLR_CC([%locations %defines %pure-parser %define parse.error verbose %debug %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} {int *count}]) +AT_CHECK_CALC_GLR_CC([%locations %defines %pure-parser %define parse.error verbose %debug %define api.prefix "calc" %verbose %yacc %parse-param {semantic_value *result} {int *count}]) -- 2.47.2