* data/lalr1-fusion.cc (yydestruct_): Invoke the variant's
destructor.
Display the value only if yymsg is nonnull.
(yyreduce): Invoke yydestruct_ when popping lhs symbols.
This is used to help the user catch cases where some value gets
ovewritten by a new one. This should not happen, as this will
probably leak.
Unfortunately this uncovered a bug in the C++ parser itself: the
lookahead value was not destroyed between two calls to yylex. For
instance if the previous lookahead was a std::string, and then an int,
then the value of the std::string was correctly taken (i.e., the
lookahead was now an empty string), but std::string structure itself
was not reclaimed.
This is now done in variant::build(other&) (which is used to take the
value of the lookahead): other is not only stolen from its value, it
is also destroyed. This incurs a new performance penalty of a few
percent, and union becomes faster again.
* data/lalr1-fusion.cc (variant::build(other&)): Destroy other.
(b4_variant_if): New.
(variant::built): New.
Use it whereever the status of the variant changes.
* etc/bench.pl.in: Check the penalty of %define assert.
Reported by Sergei Steshenko at
<http://lists.gnu.org/archive/html/bug-bison/2008-11/msg00001.html>.
* THANKS (Sergei Steshenko): Add.
* src/scan-code.l (SC_RULE_ACTION): Fix it.
* tests/regression.at (Fix user actions without a trailing semicolon):
New test case.
* etc/bench.pl.in (&run, &generate_grammar): New.
Rename the grammar generating functions for consistency.
Change the interface so that the list of benches to run is passed
as (optionless) arguments.
(&compile): Use &run.
* data/lalr1-fusion.cc (b4_symbol_variant): Adjust additional
arguments.
(variant::build): New overload for
copy-construction-that-destroys.
(variant::swap): New.
(parser::yypush_): Use it in variant mode.
std::list cannot be copied via memcpy, they are more demanding than
std::string. Use one std::list to strengthen the test.
* examples/variant.yy: Use lalr1-fusion.cc, not lalr1.cc.
Adjust.
Create a list of strings, instead of a single large string.
* data/bison.m4 (b4_copyright): Fix the indentation of the
copyright year paragraph.
Use b4_copyright_years when no years are given.
* data/lalr1.cc, data/lalr1-fusion.cc, data/location.cc
(b4_copyright_years): New.
Use it.
* doc/bison.texinfo (calc++.cc): Propagate failures to the exit
status.
* examples/calc++/test ($me, $number, $exit, run): New.
Use them to propagate errors to the exit status.
* etc/bench.pl.in (variant_grammar): Fix the computation of
$variant.
Generate a grammar file that can work with or without %debug.
Do use the @directive.
(bench_variant_parser): Check impact of %debug.
(@directives): Rename all the occurrences to...
(@directive): this, for consistency.
* etc/bench.pl.in: More doc.
Some fixes in the documentation.
($cflags, $iterations, &help, &getopt): New.
Use them.
(&variant_grammar): Let the number of stages be 10 times what is
specified.
* etc/bench.pl.in ($cxx, &variant_grammar, &bench_variant_parser):
New.
(&compile): Be ready to compile C++ parsers.
(&bench_push_parser): Move debug information to the outermost
level.
* THANKS: Add Michiel De Wilde.
* etc/bench.pl.in (&directives): New.
(&triangular_grammar, &calc_grammar): Use it to format the Bison
directives.
(&triangular_grammar): Do use the directives (were ignored).
(&bench_grammar, &bench_push_parser): Adjust to pass lists of
directives.
In order to make it easy to perform benchmarks to ensure that there are no
performance loss, lalr1.cc is forked into lalr1-fusion.cc. Eventually,
lalr1-fusion.cc will replace lalr1.cc.
Meanwhile, to make sure that lalr1-fusion.cc is correctly exercized by the
test suite, the user must install a symbolic link from lalr1.cc to it.
Instead of having three stacks (state, value, location), use a stack
of triples. This considerably simplifies the code (and it will be
easier not to require locations as currently does the C++ parser),
and also gives a 10% speedup according to etc/bench (probably mainly since
memory allocation is done once instead of three times).
Another motivation is to make it easier to destruct properly
semantic values: now that they are bound to their state (hence
symbol type) it will be easier to call the appropriate destructor.
These changes should probably benefit the C parser too.
* data/lalr1.cc: Copy as... * data/lalr1-fusion.cc: this new
file.
(b4_rhs_value, b4_rhs_location): New definitions overriding those
from c++.m4.
(state_stack_type, semantic_stack_type, location_stack_type)
(yystate_stack_, yysemantic_stack_, yylocation_stack_): Remove.
(data_type, stack_type, yystack_): New.
(YYLLOC_DEFAULT, yypush_): Adjust.
(yyerror_range): Now based on data_type, not location_type.
This is needed to prepare a forthcoming patch that fuses the three
stacks into one.
* data/lalr1.cc (parser::yypush_): New.
(parser::yynewstate): Change the semantics: instead of arriving to
this label when value and location have been pushed, but yystate
is to be pushed on the state stack, now the three of them must
have been pushed before. yystate still must be the new state.
This allows to use yypush_ everywhere instead of individual
handling of the stacks.
* data/lalr1.cc (b4_symbol_actions): New, overrides the default C
definition to use references instead of pointers.
(yy_symbol_value_print_, yy_symbol_print_, yydestruct_):
Take the value and location as references.
Adjust callers.
This patch was inspired by work by Michiel De Wilde. But he used Boost
variants which (i) requires Boost on the user side, (ii) is slow, and
(iii) has useless overhead (the parser knows the type of the semantic value
there is no reason to duplicate this information as Boost.Variants do).
This implementation reserves a buffer large enough to store the largest
objects. yy::variant implements this buffer. It was implemented with
Quentin Hocquet.
* src/output.c (type_names_output): New.
(output_skeleton): Invoke it.
* data/c++.m4 (b4_variant_if): New.
(b4_symbol_value): If needed, provide a definition for variants.
* data/lalr1.cc (b4_symbol_value, b4_symbol_action_)
(b4_symbol_variant, _b4_char_sizeof_counter, _b4_char_sizeof_dummy)
(b4_char_sizeof, yy::variant): New.
(parser::parse): If variants are requested, define
parser::union_type, parser::variant, change the definition of
semantic_type, construct $$ before running the user action instead
of performing a default $$ = $1.
* examples/variant.yy: New.
Based on an example by Michiel De Wilde.
To make future changes easier, no longer rely on ".TYPE" being the
way to get a semantic value.
* data/c.m4 (b4_symbol_value): New.
Use it.
* data/c++.m4, data/yacc.c: Use it.
* data/glr.c: Use b4_symbol_value.
(b4_rhs_data): New.
Use it.