typedef enum { TYPE_NONE, TYPE_VOID, TYPE_BOOL, TYPE_CHAR, TYPE_SCHAR, TYPE_UCHAR, TYPE_SHORT, TYPE_USHORT, TYPE_INT, TYPE_UINT, TYPE_LONG, TYPE_ULONG, TYPE_LLONG, TYPE_ULLONG, TYPE_FLOAT, TYPE_DOUBLE, TYPE_LDOUBLE, TYPE_POINTER, TYPE_ARRAY, TYPE_FUNCTION, TYPE_STRUCT, TYPE_UNION, TYPE_ENUM, } Type_Kind; typedef struct Type Type; struct Type { Type_Kind kind; int size; int align; Type *base; }; typedef enum Ast_Kind { AST_NONE, AST_ERROR, AST_PROGRAM, AST_INT, AST_UNARY, AST_BINARY, AST_FUNCTION, AST_BLOCK, } Ast_Kind; typedef struct Ast Ast; struct Ast { Ast_Kind kind; Token *pos; Ast *first; Ast *last; union { uint64_t u; struct { Token_Kind op; Ast *l; Ast *r; }; char *error; }; }; Ast *create_ast(Token *token, Ast_Kind kind) { Ast *result = calloc(1, sizeof(Ast)); result->pos = token; result->kind = kind; return result; } Ast *create_binary_expr(Token *token, Token_Kind op, Ast *left, Ast *right) { Ast *result = create_ast(token, AST_BINARY); result->op = op; result->l = left; result->r = right; return result; } Type base_type_int = {TYPE_INT, .size = sizeof(int), .align = __alignof(int)}; Type *type_int = &base_type_int;