Files
smallprojects/ast.c
2026-05-23 17:48:42 +02:00

88 lines
1.4 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_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;