mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
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:
10
NEWS
10
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.
|
||||
|
||||
|
||||
3
TODO
3
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.
|
||||
|
||||
@@ -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. ##
|
||||
|
||||
57
data/glr.cc
57
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])
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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}])
|
||||
|
||||
Reference in New Issue
Block a user