Asignación de múltiples tipos de datos a un no terminal en yacc

Estoy trabajando en un proyecto para la clase en el que tenemos que construir un analizador sintáctico. Actualmente estamos en la etapa de construcción del analizador en yacc. Lo que me confunde actualmente es que he leído que debe asignar un tipo a cada no terminal. Sin embargo, en algunos casos tendré algo como:

...
%union {
    Type dataType;
    int integerConstant;
    bool boolConstant;
    char *stringConstant;
    double doubleConstant;
    char identifier[MaxIdentLen+1]; // +1 for terminating null
    Decl *decl;
    List<Decl*> *declList;
}

%token   <identifier> T_Identifier
%token   <stringConstant> T_StringConstant 
%token   <integerConstant> T_IntConstant
%token   <doubleConstant> T_DoubleConstant
%token   <boolConstant> T_BoolConstant

...

%%
...
Expr                :    /* some rules */
                    |    Constant { /* Need to figure out what to do here */ }
                    |    /* some more rules */
                    ;

Constant            :    T_IntConstant { $=$1 }
                    |    T_DoubleConstant { $=$1 }
                    |    T_BoolConstant { $=$1 }
                    |    T_StringConstant { $=$1 }
                    |    T_Null { $=$1 }
...

¿Cómo puedes asignar un tipo a expr ya que a veces no puede ser un número entero o doble, o bool, etc.?

Respuestas a la pregunta(1)

Su respuesta a la pregunta