Next: The Union Declaration, Previous: More Than One Value Type, Up: Defining Language Semantics [Contents][Index]
The special value union
of the %define
variable
api.value.type
instructs Bison that the type tags (used with the
%token
, %nterm
and %type
directives) are genuine types,
not names of members of YYSTYPE
.
For example:
%define api.value.type union %token <int> INT "integer" %token <int> 'n' %nterm <int> expr %token <char const *> ID "identifier"
generates an appropriate value of YYSTYPE
to support each symbol
type. The name of the member of YYSTYPE
for tokens than have a
declared identifier id (such as INT
and ID
above, but
not 'n'
) is id
. The other symbols have unspecified
names on which you should not depend; instead, relying on C casts to access
the semantic value with the appropriate type:
/* For an "integer". */ yylval.INT = 42; return INT; /* For an 'n', also declared as int. */ *((int*)&yylval) = 42; return 'n'; /* For an "identifier". */ yylval.ID = "42"; return ID;
If the %define
variable api.token.prefix
is defined
(see %define Summary), then it is also used to prefix
the union member names. For instance, with ‘%define api.token.prefix
{TOK_}’:
/* For an "integer". */ yylval.TOK_INT = 42; return TOK_INT;
This Bison extension cannot work if %yacc
(or
-y/--yacc) is enabled, as POSIX mandates that Yacc
generate tokens as macros (e.g., ‘#define INT 258’, or ‘#define
TOK_INT 258’).
A similar feature is provided for C++ that in addition overcomes C++
limitations (that forbid non-trivial objects to be part of a union
):
‘%define api.value.type variant’, see C++ Variants.
Next: The Union Declaration, Previous: More Than One Value Type, Up: Defining Language Semantics [Contents][Index]