84 lines
1.3 KiB
C
84 lines
1.3 KiB
C
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_INT,
|
|
AST_UNARY,
|
|
AST_BINARY,
|
|
|
|
AST_FUNCTION,
|
|
AST_BLOCK,
|
|
|
|
} Ast_Kind;
|
|
|
|
typedef struct Ast Ast;
|
|
struct Ast {
|
|
Ast_Kind kind;
|
|
Token *pos;
|
|
|
|
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;
|