Atribuindo vários tipos de dados a um não terminal no yacc
Estou trabalhando em um projeto para a classe em que temos que construir um analisador. Atualmente, estamos no estágio de construção do analisador em yacc. O que atualmente me confunde é que li que você precisa atribuir um tipo a cada não-terminal. Em alguns casos, porém, terei 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 }
...
Como você pode atribuir um tipo a expr, já que às vezes não pode ser um número inteiro ou duplo, ou bool, etc?