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.
This commit is contained in:
Akim Demaille
2012-08-15 08:46:54 +02:00
parent 836dc3342b
commit e4c0985b5c
6 changed files with 46 additions and 42 deletions

10
NEWS
View File

@@ -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.

3
TODO
View File

@@ -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.

View 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. ##

View File

@@ -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])

View 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
{

View 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}])