b4_semantic_type_declare.

* data/c++.m4 (b4_semantic_type_declare): New.
	Factors and generalizes what was in glr.cc and lalr1.cc.
	* data/variant.hh (b4_semantic_type_declare): Redefine it for
	variants.
	* data/lalr1.cc, data/glr.cc: Use it.
This commit is contained in:
Akim Demaille
2008-12-31 12:44:58 +01:00
parent 6a6e7f0c65
commit b9e4eb5b72
5 changed files with 37 additions and 24 deletions

View File

@@ -97,6 +97,20 @@ m4_map_sep([ b4_token_enum], [,
## Semantic Values. ##
## ----------------- ##
# b4_semantic_type_declare
# ------------------------
# Declare semantic_type.
m4_define([b4_semantic_type_declare],
[ /// Symbol semantic values.
m4_ifdef([b4_stype],
[ union semantic_type
{b4_user_stype
};],
[m4_if(b4_tag_seen_flag, 0,
[[ typedef int semantic_type;]],
[[ typedef YYSTYPE semantic_type;]])])])
# b4_variant_if([IF-VARIANT-ARE-USED], [IF-NOT])
# ----------------------------------------------
m4_define([b4_variant_if],

View File

@@ -266,16 +266,8 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++],
class ]b4_parser_class_name[
{
public:
/// Symbol semantic values.
#ifndef YYSTYPE
]m4_ifdef([b4_stype],
[ union semantic_type
{
b4_user_stype
};],
[m4_if(b4_tag_seen_flag, 0,
[[ typedef int semantic_type;]],
[[ typedef YYSTYPE semantic_type;]])])[
]b4_semantic_type_declare[
#else
typedef YYSTYPE semantic_type;
#endif

View File

@@ -389,21 +389,7 @@ do { \
{
public:
#ifndef YYSTYPE
]b4_variant_if(
[ /// 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;],
[ /// Symbol semantic values.
m4_ifdef([b4_stype],
[ union semantic_type
{b4_user_stype
};],
[m4_if(b4_tag_seen_flag, 0,
[[ typedef int semantic_type;]],
[[ typedef YYSTYPE semantic_type;]])])])[
]b4_semantic_type_declare[
#else
typedef YYSTYPE semantic_type;
#endif]b4_locations_if([

View File

@@ -189,6 +189,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<sizeof(union_type)> semantic_type;])
# How the semantic value is extracted when using variants.
# b4_symbol_value(VAL, [TYPE])