[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
3.7.4 The Collection of Value Types
The %union
declaration specifies the entire collection of
possible data types for semantic values. The keyword %union
is
followed by braced code containing the same thing that goes inside a
union
in C.
For example:
%union { double val; symrec *tptr; } |
This says that the two alternative types are double
and symrec
*
. They are given names val
and tptr
; these names are used
in the %token
and %type
declarations to pick one of the types
for a terminal or nonterminal symbol (see section Nonterminal Symbols).
As an extension to POSIX, a tag is allowed after the
union
. For example:
%union value { double val; symrec *tptr; } |
specifies the union tag value
, so the corresponding C type is
union value
. If you do not specify a tag, it defaults to
YYSTYPE
.
As another extension to POSIX, you may specify multiple
%union
declarations; their contents are concatenated. However,
only the first %union
declaration can specify a tag.
Note that, unlike making a union
declaration in C, you need not write
a semicolon after the closing brace.
Instead of %union
, you can define and use your own union type
YYSTYPE
if your grammar contains at least one
‘<type>’ tag. For example, you can put the following into
a header file ‘parser.h’:
union YYSTYPE { double val; symrec *tptr; }; typedef union YYSTYPE YYSTYPE; |
and then your grammar can use the following
instead of %union
:
%{ #include "parser.h" %} %type <val> expr %token <tptr> ID |