В качестве дальнейшей мысли, если вы хотите быть более явными со своими сокращениями (если вы делаете аннотацию AST, это может быть удобно), тогда вы можете сделать ваши значения в стеке указателями, а затем обрабатывать значения типов самостоятельно. Очень похоже на скалярные типы с:
struct myScalar {
union {
int num;
char *id;
char *float_lexeme;
}payload;
enum {
TYPE_NUM,
TYPE_IDENTIFIER,
TYPE_FLOAT_CHAR
} type;
char *orig_lexeme;
};
И иметь typedef и scalar_val *val
для стека.
Когда вы переходите к более сложным интерфейсам компилятора, это может помочь построить ваш AST таким образом, чтобы при обходе дерева у вас были лучшие метаданные и вы могли также дополнить перевод переводами для предсемантических типов , Затем все сводится к вашим конечным произведениям, таким как ID, чтобы перетасовать лексему в правильную скалярную полезную нагрузку.
Не полное объяснение, но вы поняли идею.
Надеюсь, это поможет вашим будущим пользователям Bison / Lex и ...
Удачи