bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] {master} glr.cc: %defines is no longer mandatory


From: Akim Demaille
Subject: [PATCH] {master} glr.cc: %defines is no longer mandatory
Date: Tue, 4 Sep 2012 10:06:12 +0200

Now neither %locations nor %defines is mandatory for any of the skeletons.  It 
should have been this way from the beginning…

The test suite needs further refactoring, but that's for later.

From e4c0985b5cf193831a3b7fe2aab792cab3ffe6e2 Mon Sep 17 00:00:00 2001
From: Akim Demaille <address@hidden>
Date: Wed, 15 Aug 2012 08:46:54 +0200
Subject: [PATCH] {master} 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 fd74936..8f52f80 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 2907d99..25fce49 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 ce81510..46eaccc 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 56edcb2..8f0027e 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 <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])
diff --git a/tests/actions.at b/tests/actions.at
index dd71c3b..c1af5ea 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 03530a0..f785d6f 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}])
-- 
1.7.11.5





reply via email to

[Prev in Thread] Current Thread [Next in Thread]