# C++ skeleton for Bison
-# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008-2009 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
])])
-# 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.
///
/// via the current state.
template <size_t S>
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)])[
{}
template <typename T>
inline T&
build ()
- {]b4_assert_if([
+ {]b4_parse_assert_if([
assert (!built);
built = true;])[
return *new (buffer.raw) T;
template <typename T>
inline T&
build (const T& t)
- {]b4_assert_if([
+ {]b4_parse_assert_if([
assert(!built);
built = true;])[
return *new (buffer.raw) T(t);
/// Construct and fill.
template <typename T>
inline
- variant (const T& t)]b4_assert_if([
+ variant (const T& t)]b4_parse_assert_if([
: built (true)])[
{
new (buffer.raw) T(t);
template <typename T>
inline T&
as ()
- {]b4_assert_if([
+ {]b4_parse_assert_if([
assert (built);])[
return reinterpret_cast<T&>(buffer.raw);
}
template <typename T>
inline const T&
as () const
- {]b4_assert_if([
+ {]b4_parse_assert_if([
assert(built);])[
return reinterpret_cast<const T&>(buffer.raw);
}
inline void
destroy ()
{
- as<T>().~T();]b4_assert_if([
+ as<T>().~T();]b4_parse_assert_if([
built = false;])[
}
## -------------------------- ##
+# 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<sizeof(union_type)> semantic_type;])
+
+
# How the semantic value is extracted when using variants.
# b4_symbol_value(VAL, [TYPE])
[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([yytranslate_ (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_])])