WIP top-level parsing and keyword tokens
This commit is contained in:
83
ast.c
Normal file
83
ast.c
Normal file
@@ -0,0 +1,83 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user