Next: Type Decl, Previous: Precedence Decl, Up: Declarations
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 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