mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-21 02:03:03 +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
|
** 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)
|
*** locations are no longer mandatory (lalr1.cc, glr.cc)
|
||||||
|
|
||||||
Both lalr1.cc and glr.cc no longer require %location.
|
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_shared_declarations is no longer what it is. Make it
|
||||||
b4_parser_declaration for instance.
|
b4_parser_declaration for instance.
|
||||||
|
|
||||||
|
** glr.cc: %defines
|
||||||
|
it should not be mandatory.
|
||||||
|
|
||||||
** Variable names.
|
** Variable names.
|
||||||
What should we name `variant' and `lex_symbol'?
|
What should we name `variant' and `lex_symbol'?
|
||||||
|
|
||||||
|
|||||||
@@ -120,10 +120,6 @@ m4_pushdef([b4_copyright_years],
|
|||||||
m4_define([b4_parser_class_name],
|
m4_define([b4_parser_class_name],
|
||||||
[b4_percent_define_get([[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]], [],
|
b4_locations_if([b4_percent_define_ifdef([[location_type]], [],
|
||||||
[# Backward compatibility.
|
[# Backward compatibility.
|
||||||
m4_define([b4_location_constructors])
|
m4_define([b4_location_constructors])
|
||||||
@@ -141,18 +137,21 @@ m4_define([b4_shared_declarations],
|
|||||||
# include <stdexcept>
|
# include <stdexcept>
|
||||||
# include <string>
|
# include <string>
|
||||||
# include <iostream>
|
# 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[
|
]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_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.
|
/// A Bison parser.
|
||||||
class ]b4_parser_class_name[
|
class ]b4_parser_class_name[
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,27 +18,11 @@
|
|||||||
m4_pushdef([b4_copyright_years],
|
m4_pushdef([b4_copyright_years],
|
||||||
[2002-2012])
|
[2002-2012])
|
||||||
|
|
||||||
# We do want M4 expansion after # for CPP macros.
|
# b4_position_define
|
||||||
m4_changecom()
|
# ------------------
|
||||||
m4_divert_push(0)dnl
|
# Define class position.
|
||||||
@output(b4_dir_prefix[]position.hh@)@
|
m4_define([b4_position_define],
|
||||||
b4_copyright([Positions for Bison parsers in C++])[
|
[[ /// Abstract a position.
|
||||||
|
|
||||||
/**
|
|
||||||
** \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.
|
|
||||||
class position
|
class position
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -147,26 +131,13 @@ b4_copyright([Positions for Bison parsers in C++])[
|
|||||||
ostr << *pos.filename << ':';
|
ostr << *pos.filename << ':';
|
||||||
return ostr << pos.line << '.' << pos.column;
|
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++])[
|
|
||||||
|
|
||||||
/**
|
# b4_location_define
|
||||||
** \file ]b4_dir_prefix[location.hh
|
# ------------------
|
||||||
** Define the ]b4_namespace_ref[::location class.
|
m4_define([b4_location_define],
|
||||||
*/
|
[[ /// Abstract a location.
|
||||||
|
|
||||||
]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[
|
|
||||||
|
|
||||||
# include <iostream>
|
|
||||||
# include <string>
|
|
||||||
# include "position.hh"
|
|
||||||
|
|
||||||
]b4_namespace_open[
|
|
||||||
|
|
||||||
/// Abstract a location.
|
|
||||||
class location
|
class location
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -291,10 +262,52 @@ b4_copyright([Locations for Bison parsers in C++])[
|
|||||||
ostr << '-' << last.column;
|
ostr << '-' << last.column;
|
||||||
return ostr;
|
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_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])
|
]b4_cpp_guard_close([b4_dir_prefix[]location.hh])
|
||||||
m4_divert_pop(0)
|
m4_divert_pop(0)
|
||||||
|
])# b4_defines_if
|
||||||
m4_popdef([b4_copyright_years])dnl
|
m4_popdef([b4_copyright_years])dnl
|
||||||
m4_changecom([#])
|
m4_changecom([#])
|
||||||
|
|||||||
@@ -113,9 +113,15 @@ AT_CHECK([grep 'include .subdir/' $1.cc], 1, [])
|
|||||||
AT_CHECK([grep 'include .subdir/' $1.hh], 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], [],
|
AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose], [],
|
||||||
[foo.tab.cc foo.tab.hh foo.output stack.hh])
|
[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], [],
|
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])
|
[foo.tab.cc foo.tab.hh foo.output location.hh stack.hh position.hh])
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user