X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/507aa0e2a80ee035146a6429a64df9d6e6fb8a3b..dd31e17d7e415d3be8fc603f752f7e975297bcc2:/data/variant.hh diff --git a/data/variant.hh b/data/variant.hh index 89367338..5895b297 100644 --- a/data/variant.hh +++ b/data/variant.hh @@ -1,7 +1,6 @@ # C++ skeleton for Bison -# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 2002-2012 Free Software Foundation, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -75,10 +74,10 @@ m4_map([b4_char_sizeof_], [$@])dnl ])]) -# b4_variant_definition -# --------------------- +# b4_variant_define +# ----------------- # Define "variant". -m4_define([b4_variant_definition], +m4_define([b4_variant_define], [[ /// A char[S] buffer to store and retrieve objects. /// @@ -87,13 +86,13 @@ m4_define([b4_variant_definition], /// via the current state. template struct variant - {]b4_assert_if([ + {]b4_parse_assert_if([ /// Whether something is contained. bool built; ])[ /// Empty construction. inline - variant ()]b4_assert_if([ + variant ()]b4_parse_assert_if([ : built (false)])[ {} @@ -101,7 +100,7 @@ m4_define([b4_variant_definition], template inline T& build () - {]b4_assert_if([ + {]b4_parse_assert_if([ assert (!built); built = true;])[ return *new (buffer.raw) T; @@ -111,7 +110,7 @@ m4_define([b4_variant_definition], template inline T& build (const T& t) - {]b4_assert_if([ + {]b4_parse_assert_if([ assert(!built); built = true;])[ return *new (buffer.raw) T(t); @@ -120,7 +119,7 @@ m4_define([b4_variant_definition], /// Construct and fill. template inline - variant (const T& t)]b4_assert_if([ + variant (const T& t)]b4_parse_assert_if([ : built (true)])[ { new (buffer.raw) T(t); @@ -130,7 +129,7 @@ m4_define([b4_variant_definition], template inline T& as () - {]b4_assert_if([ + {]b4_parse_assert_if([ assert (built);])[ return reinterpret_cast(buffer.raw); } @@ -139,7 +138,7 @@ m4_define([b4_variant_definition], template inline const T& as () const - {]b4_assert_if([ + {]b4_parse_assert_if([ assert(built);])[ return reinterpret_cast(buffer.raw); } @@ -168,7 +167,7 @@ m4_define([b4_variant_definition], inline void destroy () { - as().~T();]b4_assert_if([ + as().~T();]b4_parse_assert_if([ built = false;])[ } @@ -189,6 +188,18 @@ m4_define([b4_variant_definition], ## -------------------------- ## +# b4_semantic_type_declare +# ------------------------ +# Declare semantic_type. +m4_define([b4_semantic_type_declare], +[ /// An auxiliary type to compute the largest semantic type. + union union_type + {]b4_type_foreach([b4_char_sizeof])[}; + + /// Symbol semantic values. + typedef variant semantic_type;]) + + # How the semantic value is extracted when using variants. # b4_symbol_value(VAL, [TYPE]) @@ -205,3 +216,62 @@ m4_define([b4_symbol_value_template], [m4_ifval([$2], [$1.template as< $2 >()], [$1])]) + + + +## ------------- ## +## make_SYMBOL. ## +## ------------- ## + + +# b4_symbol_constructor_declare_(SYMBOL-NUMBER) +# --------------------------------------------- +# Declare the overloaded version of make_symbol for the (common) type of +# these SYMBOL-NUMBERS. Use at class-level. +m4_define([b4_symbol_constructor_declare_], +[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id], +[ static inline + symbol_type + make_[]b4_symbol_([$1], [id]) (dnl +b4_args(b4_symbol_if([$1], [has_type], + [const b4_symbol([$1], [type])& v]), + b4_locations_if([const location_type& l]))); + +])])]) + + +# b4_symbol_constructor_declare +# ----------------------------- +# Declare symbol constructors for all the value types. +# Use at class-level. +m4_define([b4_symbol_constructor_declare], +[ // Symbol constructors declarations. +b4_symbol_foreach([b4_symbol_constructor_declare_])]) + + + +# b4_symbol_constructor_define_(SYMBOL-NUMBER) +# -------------------------------------------- +# Define symbol constructor for this SYMBOL-NUMBER. +m4_define([b4_symbol_constructor_define_], +[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id], +[ b4_parser_class_name::symbol_type + b4_parser_class_name::make_[]b4_symbol_([$1], [id]) (dnl +b4_args(b4_symbol_if([$1], [has_type], + [const b4_symbol([$1], [type])& v]), + b4_locations_if([const location_type& l]))) + { + return symbol_type (b4_args([token::b4_symbol([$1], [id])], + b4_symbol_if([$1], [has_type], [v]), + b4_locations_if([l]))); + } + +])])]) + + +# b4_symbol_constructor_define +# ---------------------------- +# Define the overloaded versions of make_symbol for all the value types. +m4_define([b4_symbol_constructor_define], +[ // Implementation of make_symbol for each symbol type. +b4_symbol_foreach([b4_symbol_constructor_define_])])