]> git.saurik.com Git - bison.git/commitdiff
glr.cc: %defines is no longer mandatory
authorAkim Demaille <akim@lrde.epita.fr>
Wed, 15 Aug 2012 06:46:54 +0000 (08:46 +0200)
committerAkim Demaille <akim@lrde.epita.fr>
Mon, 3 Sep 2012 14:23:15 +0000 (16:23 +0200)
* 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
TODO
data/glr.c
data/glr.cc
tests/actions.at
tests/calc.at

diff --git a/NEWS b/NEWS
index fd749368d50ebcfa12ffcb784fd99b2ee572b346..8f52f80c6fabc3b263de2bfe6532c2b89d3b1ff6 100644 (file)
--- 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 2907d992e9707d524ff313775bb3e9aee7ee1f85..25fce49905b05d36edd41cb3360d044f25571013 100644 (file)
--- 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.
index ce81510b07b1b4e917652170a6980c14dabfbdb9..46eaccc7c938d22de490e204f5eaa1fc3a27913b 100644 (file)
@@ -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.  ##
index 56edcb21389d421db0448046095d359f5058ca82..8f0027ee11e8725eae7392bc9308b898971279f1 100644 (file)
 # 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 <stdexcept>
 #include <string>
-#include <iostream>
-]b4_percent_define_ifdef([[location_type]], [],
-                         [[#include "location.hh"]])[
+#include <iostream>]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])
index dd71c3b48e301eb8cb925e69dd601e64789f2b9d..c1af5eaa2ab47b33095720f1b8cd8ac23e36cf4e 100644 (file)
@@ -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
 {
index 03530a0c43a408fef87e0298530f4b0320e8d4c4..f785d6f07f2821a865fd452d4892b0662001cca2 100644 (file)
@@ -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}])