]> git.saurik.com Git - bison.git/commit - data/lalr1.cc
Use variants to support objects as semantic values.
authorAkim Demaille <demaille@gostai.com>
Tue, 21 Oct 2008 23:00:29 +0000 (18:00 -0500)
committerAkim Demaille <demaille@gostai.com>
Mon, 3 Nov 2008 20:50:48 +0000 (21:50 +0100)
commit5ab8c47bcf5088cf420db6e03cd44bfa68e92ca0
tree6d6e1f5ce54a22dd164e6a14f242a76e744b9e37
parent1fa5d8bbf92cc7ab3f7294b8f4f4465b04d4444a
Use variants to support objects as semantic values.

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.
ChangeLog
THANKS
data/c++.m4
data/lalr1.cc
examples/variant.yy [new file with mode: 0644]
src/output.c