Next: , Previous: Precedence Decl, Up: Declarations


3.8.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 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