lalr1.cc: do not create stack.hh without %defines

* data/stack.hh (b4_stack_define): New.
* data/lalr1.cc: Use it when %defines is not passed.
* tests/output.at: Adjust expected output.
This commit is contained in:
Akim Demaille
2012-07-30 16:51:29 +02:00
parent 93549bcd43
commit 5de5b98751
5 changed files with 45 additions and 29 deletions

3
NEWS
View File

@@ -87,7 +87,8 @@ GNU Bison NEWS
*** 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.
parser, instead of additional files (location.hh, position.hh and
stack.hh).
*** locations are no longer mandatory (lalr1.cc, glr.cc)

5
TODO
View File

@@ -10,6 +10,11 @@ b4_parser_declaration for instance.
** glr.cc: %defines
it should not be mandatory.
** stack.hh
Get rid of it. The original idea is nice, but actually it makes
the code harder to follow, and uselessly different from the other
skeletons.
** Variable names.
What should we name `variant' and `lex_symbol'?

View File

@@ -134,20 +134,22 @@ b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])])
m4_define([b4_shared_declarations],
[b4_percent_code_get([[requires]])[
]b4_parse_assert_if([# include <cassert>])[
# include <stdexcept>
# include <string>
# include <deque>
# include <iostream>
# include <stdexcept>
# include <string>]b4_defines_if([[
# include "stack.hh"
]b4_locations_if([b4_percent_define_ifdef([[location_type]], [],
[[# include "location.hh"]])])])[
]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_defines_if([],
[b4_stack_define
b4_locations_if([b4_percent_define_ifdef([[location_type]], [],
[b4_position_define
b4_location_define])])])[
]b4_variant_if([b4_variant_define])[

View File

@@ -18,23 +18,10 @@
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[]stack.hh@)@
b4_copyright([Stack handling for Bison parsers in C++])[
/**
** \file ]b4_dir_prefix[stack.hh
** Define the ]b4_namespace_ref[::stack class.
*/
]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[
# include <deque>
]b4_namespace_open[
template <class T, class S = std::deque<T> >
# b4_stack_define
# ---------------
m4_define([b4_stack_define],
[[ template <class T, class S = std::deque<T> >
class stack
{
public:
@@ -129,9 +116,30 @@ b4_copyright([Stack handling for Bison parsers in C++])[
const S& stack_;
unsigned int range_;
};
]])
b4_defines_if(
[# We do want M4 expansion after # for CPP macros.
m4_changecom()
m4_divert_push(0)dnl
@output(b4_dir_prefix[]stack.hh@)@
b4_copyright([Stack handling for Bison parsers in C++])[
/**
** \file ]b4_dir_prefix[stack.hh
** Define the ]b4_namespace_ref[::stack class.
*/
]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[
# include <deque>
]b4_namespace_open[
]b4_stack_define[
]b4_namespace_close[
]b4_cpp_guard_close([b4_dir_prefix[]stack.hh])
m4_divert_pop(0)
m4_popdef([b4_copyright_years])dnl
m4_changecom([#])
])

View File

@@ -114,13 +114,13 @@ AT_CHECK([grep 'include .subdir/' $1.hh], 1, [])
])
AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose], [],
[foo.tab.cc foo.output stack.hh])
[foo.tab.cc foo.output])
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])
AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose %locations], [],
[foo.tab.cc foo.output stack.hh])
[foo.tab.cc foo.output])
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])