mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
lalr1.cc: location.hh and position.hh are not generated without %defines
* data/location.cc (b4_position_define, b4_location_define): New. (location.hh, position.hh): Generate only if %defines. * data/lalr1.cc: therefore, define these classes when locations are needed, but headers are not generated. * tests/output.at: Check that these files are not generated. * NEWS: Document.
This commit is contained in:
5
NEWS
5
NEWS
@@ -84,6 +84,11 @@ GNU Bison NEWS
|
||||
|
||||
** C++ skeletons improvements
|
||||
|
||||
*** parser header (%defines) is no longer mandatory (lalr1.cc)
|
||||
|
||||
In which case, if needed, the support classes are defined in the generated
|
||||
parser, instead of additional files such as position.hh and location.hh.
|
||||
|
||||
*** locations are no longer mandatory (lalr1.cc, glr.cc)
|
||||
|
||||
Both lalr1.cc and glr.cc no longer require %location.
|
||||
|
||||
3
TODO
3
TODO
@@ -7,6 +7,9 @@ show_sub_messages should call show_sub_message.
|
||||
b4_shared_declarations is no longer what it is. Make it
|
||||
b4_parser_declaration for instance.
|
||||
|
||||
** glr.cc: %defines
|
||||
it should not be mandatory.
|
||||
|
||||
** Variable names.
|
||||
What should we name `variant' and `lex_symbol'?
|
||||
|
||||
|
||||
@@ -120,10 +120,6 @@ m4_pushdef([b4_copyright_years],
|
||||
m4_define([b4_parser_class_name],
|
||||
[b4_percent_define_get([[parser_class_name]])])
|
||||
|
||||
# The header is mandatory.
|
||||
b4_defines_if([],
|
||||
[b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
|
||||
|
||||
b4_locations_if([b4_percent_define_ifdef([[location_type]], [],
|
||||
[# Backward compatibility.
|
||||
m4_define([b4_location_constructors])
|
||||
@@ -141,18 +137,21 @@ m4_define([b4_shared_declarations],
|
||||
# include <stdexcept>
|
||||
# include <string>
|
||||
# include <iostream>
|
||||
# include "stack.hh"
|
||||
]b4_locations_if([b4_percent_define_ifdef([[location_type]], [],
|
||||
[[# include "location.hh"]])])[
|
||||
|
||||
]b4_variant_if([b4_namespace_open
|
||||
b4_variant_define
|
||||
b4_namespace_close])[
|
||||
|
||||
]b4_YYDEBUG_define[
|
||||
|
||||
# include "stack.hh"
|
||||
]b4_locations_if([b4_percent_define_ifdef([[location_type]], [],
|
||||
[b4_defines_if([[# include "location.hh"]])])])[
|
||||
|
||||
]b4_namespace_open[
|
||||
|
||||
]b4_locations_if([b4_percent_define_ifdef([[location_type]], [],
|
||||
[b4_defines_if([], [b4_position_define
|
||||
b4_location_define])])])[
|
||||
|
||||
]b4_variant_if([b4_variant_define])[
|
||||
|
||||
/// A Bison parser.
|
||||
class ]b4_parser_class_name[
|
||||
{
|
||||
|
||||
@@ -18,27 +18,11 @@
|
||||
m4_pushdef([b4_copyright_years],
|
||||
[2002-2012])
|
||||
|
||||
# We do want M4 expansion after # for CPP macros.
|
||||
m4_changecom()
|
||||
m4_divert_push(0)dnl
|
||||
@output(b4_dir_prefix[]position.hh@)@
|
||||
b4_copyright([Positions for Bison parsers in C++])[
|
||||
|
||||
/**
|
||||
** \file ]b4_dir_prefix[position.hh
|
||||
** Define the ]b4_namespace_ref[::position class.
|
||||
*/
|
||||
|
||||
]b4_cpp_guard_open([b4_dir_prefix[]position.hh])[
|
||||
|
||||
# include <algorithm> // std::max
|
||||
# include <iosfwd>
|
||||
# include <string>
|
||||
|
||||
]b4_null_define[
|
||||
|
||||
]b4_namespace_open[
|
||||
/// Abstract a position.
|
||||
# b4_position_define
|
||||
# ------------------
|
||||
# Define class position.
|
||||
m4_define([b4_position_define],
|
||||
[[ /// Abstract a position.
|
||||
class position
|
||||
{
|
||||
public:
|
||||
@@ -147,26 +131,13 @@ b4_copyright([Positions for Bison parsers in C++])[
|
||||
ostr << *pos.filename << ':';
|
||||
return ostr << pos.line << '.' << pos.column;
|
||||
}
|
||||
]])
|
||||
|
||||
]b4_namespace_close[
|
||||
]b4_cpp_guard_close([b4_dir_prefix[]position.hh])
|
||||
@output(b4_dir_prefix[]location.hh@)@
|
||||
b4_copyright([Locations for Bison parsers in C++])[
|
||||
|
||||
/**
|
||||
** \file ]b4_dir_prefix[location.hh
|
||||
** Define the ]b4_namespace_ref[::location class.
|
||||
*/
|
||||
|
||||
]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[
|
||||
|
||||
# include <iostream>
|
||||
# include <string>
|
||||
# include "position.hh"
|
||||
|
||||
]b4_namespace_open[
|
||||
|
||||
/// Abstract a location.
|
||||
# b4_location_define
|
||||
# ------------------
|
||||
m4_define([b4_location_define],
|
||||
[[ /// Abstract a location.
|
||||
class location
|
||||
{
|
||||
public:
|
||||
@@ -291,10 +262,52 @@ b4_copyright([Locations for Bison parsers in C++])[
|
||||
ostr << '-' << last.column;
|
||||
return ostr;
|
||||
}
|
||||
]])
|
||||
|
||||
|
||||
# We do want M4 expansion after # for CPP macros.
|
||||
m4_changecom()
|
||||
b4_defines_if([
|
||||
m4_divert_push(0)dnl
|
||||
@output(b4_dir_prefix[]position.hh@)@
|
||||
b4_copyright([Positions for Bison parsers in C++])[
|
||||
|
||||
/**
|
||||
** \file ]b4_dir_prefix[position.hh
|
||||
** Define the ]b4_namespace_ref[::position class.
|
||||
*/
|
||||
|
||||
]b4_cpp_guard_open([b4_dir_prefix[]position.hh])[
|
||||
|
||||
# include <algorithm> // std::max
|
||||
# include <iosfwd>
|
||||
# include <string>
|
||||
|
||||
]b4_null_define[
|
||||
|
||||
]b4_namespace_open[
|
||||
]b4_position_define[
|
||||
]b4_namespace_close[
|
||||
]b4_cpp_guard_close([b4_dir_prefix[]position.hh])
|
||||
@output(b4_dir_prefix[]location.hh@)@
|
||||
b4_copyright([Locations for Bison parsers in C++])[
|
||||
|
||||
/**
|
||||
** \file ]b4_dir_prefix[location.hh
|
||||
** Define the ]b4_namespace_ref[::location class.
|
||||
*/
|
||||
|
||||
]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[
|
||||
|
||||
# include <iostream>
|
||||
# include <string>
|
||||
# include "position.hh"
|
||||
|
||||
]b4_namespace_open[
|
||||
]b4_location_define[
|
||||
]b4_namespace_close[
|
||||
]b4_cpp_guard_close([b4_dir_prefix[]location.hh])
|
||||
m4_divert_pop(0)
|
||||
])# b4_defines_if
|
||||
m4_popdef([b4_copyright_years])dnl
|
||||
m4_changecom([#])
|
||||
|
||||
@@ -113,9 +113,15 @@ AT_CHECK([grep 'include .subdir/' $1.cc], 1, [])
|
||||
AT_CHECK([grep 'include .subdir/' $1.hh], 1, [])
|
||||
])
|
||||
|
||||
AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose], [],
|
||||
[foo.tab.cc foo.output stack.hh])
|
||||
|
||||
AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose], [],
|
||||
[foo.tab.cc foo.tab.hh foo.output stack.hh])
|
||||
|
||||
AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose %locations], [],
|
||||
[foo.tab.cc foo.output stack.hh])
|
||||
|
||||
AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose %locations], [],
|
||||
[foo.tab.cc foo.tab.hh foo.output location.hh stack.hh position.hh])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user