refactor meta tables
This commit is contained in:
@@ -49,8 +49,8 @@ fn s8_t s8_serial_ast_flag_t(ma_arena_t *arena, ast_flag_t flag) {
|
||||
return result;
|
||||
}
|
||||
|
||||
fn ast_t *mt_create_ast(parser_t *par, lex_t *pos, ast_flag_t flags) {
|
||||
ast_t *result = ma_push_type(par->arena, ast_t);
|
||||
fn ast_t *mt_create_ast(ma_arena_t *arena, lex_t *pos, ast_flag_t flags) {
|
||||
ast_t *result = ma_push_type(arena, ast_t);
|
||||
memset(result, 0, sizeof(ast_t));
|
||||
result->flags = flags;
|
||||
result->pos = pos;
|
||||
@@ -62,8 +62,8 @@ fn void mt_ast_append(ast_t *parent, ast_t *node) {
|
||||
parent->len += 1;
|
||||
}
|
||||
|
||||
fn ast_t *mt_create_ast_binary(parser_t *par, lex_t *pos, ast_t *left, lex_kind_t op, ast_t *right) {
|
||||
ast_t *result = mt_create_ast(par, pos, set_bit(ast_flag_string) | set_bit(ast_flag_binary) | set_bit(ast_flag_integer));
|
||||
fn ast_t *mt_create_ast_binary(ma_arena_t *arena, lex_t *pos, ast_t *left, lex_kind_t op, ast_t *right) {
|
||||
ast_t *result = mt_create_ast(arena, pos, set_bit(ast_flag_string) | set_bit(ast_flag_binary) | set_bit(ast_flag_integer));
|
||||
mt_ast_append(result, left);
|
||||
mt_ast_append(result, right);
|
||||
result->integer = op;
|
||||
@@ -75,12 +75,12 @@ fn ast_t *mt_parse_expr(parser_t *par);
|
||||
fn ast_t *mt_parse_lit_expr(parser_t *par) {
|
||||
lex_t *token = parser_next(par);
|
||||
if (token->kind == lex_kind_integer) {
|
||||
ast_t *result = mt_create_ast(par, token, set_bit(ast_flag_integer) | set_bit(ast_flag_string));
|
||||
ast_t *result = mt_create_ast(par->arena, token, set_bit(ast_flag_integer) | set_bit(ast_flag_string));
|
||||
result->integer = token->integer;
|
||||
result->string = token->string;
|
||||
return result;
|
||||
} else if (token->kind == lex_kind_real) {
|
||||
ast_t *result = mt_create_ast(par, token, set_bit(ast_flag_real) | set_bit(ast_flag_string));
|
||||
ast_t *result = mt_create_ast(par->arena, token, set_bit(ast_flag_real) | set_bit(ast_flag_string));
|
||||
result->real = (double)token->real;
|
||||
result->string = token->string;
|
||||
return result;
|
||||
@@ -98,7 +98,7 @@ fn ast_t *mt_parse_mul_expr(parser_t *par) {
|
||||
ast_t *left = mt_parse_lit_expr(par);
|
||||
while (par->at->kind == lex_kind_multiply || par->at->kind == lex_kind_divide || par->at->kind == lex_kind_modulo) {
|
||||
lex_t *op = parser_next(par);
|
||||
left = mt_create_ast_binary(par, op, left, op->kind, mt_parse_lit_expr(par));
|
||||
left = mt_create_ast_binary(par->arena, op, left, op->kind, mt_parse_lit_expr(par));
|
||||
}
|
||||
return left;
|
||||
}
|
||||
@@ -107,7 +107,7 @@ fn ast_t *mt_parse_add_expr(parser_t *par) {
|
||||
ast_t *left = mt_parse_mul_expr(par);
|
||||
while (par->at->kind == lex_kind_plus || par->at->kind == lex_kind_minus) {
|
||||
lex_t *op = parser_next(par);
|
||||
left = mt_create_ast_binary(par, op, left, op->kind, mt_parse_lit_expr(par));
|
||||
left = mt_create_ast_binary(par->arena, op, left, op->kind, mt_parse_lit_expr(par));
|
||||
}
|
||||
return left;
|
||||
}
|
||||
@@ -116,7 +116,7 @@ fn ast_t *mt_parse_logical_and_expr(parser_t *par) {
|
||||
ast_t *left = mt_parse_add_expr(par);
|
||||
while (par->at->kind == lex_kind_or) {
|
||||
lex_t *op = parser_next(par);
|
||||
left = mt_create_ast_binary(par, op, left, op->kind, mt_parse_lit_expr(par));
|
||||
left = mt_create_ast_binary(par->arena, op, left, op->kind, mt_parse_lit_expr(par));
|
||||
}
|
||||
return left;
|
||||
}
|
||||
@@ -125,7 +125,7 @@ fn ast_t *parse_logical_or_expr(parser_t *par) {
|
||||
ast_t *left = mt_parse_logical_and_expr(par);
|
||||
while (par->at->kind == lex_kind_or) {
|
||||
lex_t *op = parser_next(par);
|
||||
left = mt_create_ast_binary(par, op, left, op->kind, mt_parse_lit_expr(par));
|
||||
left = mt_create_ast_binary(par->arena, op, left, op->kind, mt_parse_lit_expr(par));
|
||||
}
|
||||
return left;
|
||||
}
|
||||
@@ -193,11 +193,11 @@ fn void run_parser_test() {
|
||||
|
||||
fn ast_t *mt_parse_struct_mem(parser_t *par, s8_t *name) {
|
||||
lex_t *type_name = parser_expect(par, lex_kind_ident);
|
||||
ast_t *type = mt_create_ast(par, type_name, set_bit(ast_flag_type_name) | set_bit(ast_flag_string));
|
||||
ast_t *type = mt_create_ast(par->arena, type_name, set_bit(ast_flag_type_name) | set_bit(ast_flag_string));
|
||||
type->string = type_name->string;
|
||||
|
||||
while (parser_match(par, lex_kind_multiply)) {
|
||||
ast_t *pointer = mt_create_ast(par, par->at, set_bit(ast_flag_type_pointer) | set_bit(ast_flag_string));
|
||||
ast_t *pointer = mt_create_ast(par->arena, par->at, set_bit(ast_flag_type_pointer) | set_bit(ast_flag_string));
|
||||
mt_ast_append(pointer, type);
|
||||
pointer->string = s8_printf(par->arena, "%S*", type->string);
|
||||
type = pointer;
|
||||
@@ -206,7 +206,7 @@ fn ast_t *mt_parse_struct_mem(parser_t *par, s8_t *name) {
|
||||
*name = parser_expect(par, lex_kind_ident)->string;
|
||||
|
||||
while (parser_match(par, lex_kind_open_bracket)) {
|
||||
ast_t *array = mt_create_ast(par, par->at, set_bit(ast_flag_type_array) | set_bit(ast_flag_string));
|
||||
ast_t *array = mt_create_ast(par->arena, par->at, set_bit(ast_flag_type_array) | set_bit(ast_flag_string));
|
||||
mt_ast_append(array, type);
|
||||
lex_t *num = parser_match(par, lex_kind_integer);
|
||||
if (num) {
|
||||
@@ -226,7 +226,7 @@ fn ast_t *mt_parse_struct_mem(parser_t *par, s8_t *name) {
|
||||
fn ast_t *mt_parse_decls(ma_arena_t *arena, char *file, s8_t code) {
|
||||
lex_array_t tokens = lex_tokens(arena, file, code);
|
||||
parser_t *par = parser_make(arena, tokens.data);
|
||||
ast_t *result = mt_create_ast(par, par->at, set_bit(ast_flag_string));
|
||||
ast_t *result = mt_create_ast(arena, par->at, set_bit(ast_flag_string));
|
||||
result->string = s8_copy_char(arena, file);
|
||||
for (;par->at->kind != lex_kind_eof;) {
|
||||
lex_t *pos = par->at;
|
||||
@@ -235,13 +235,13 @@ fn ast_t *mt_parse_decls(ma_arena_t *arena, char *file, s8_t code) {
|
||||
b32 is_typedef = !!parser_matchi(par, s8_lit("typedef"));
|
||||
|
||||
if (is_typedef && parser_matchi(par, s8_lit("enum"))) {
|
||||
ast_t *n = mt_create_ast(par, pos, set_bit(ast_flag_string) | set_bit(ast_flag_enum));
|
||||
ast_t *n = mt_create_ast(arena, pos, set_bit(ast_flag_string) | set_bit(ast_flag_enum));
|
||||
mt_ast_append(result, n);
|
||||
|
||||
parser_expect(par, lex_kind_open_brace);
|
||||
while (par->at->kind == lex_kind_ident) {
|
||||
lex_t *val = parser_expect(par, lex_kind_ident);
|
||||
ast_t *mem = mt_create_ast(par, val, set_bit(ast_flag_enum_member) | set_bit(ast_flag_string));
|
||||
ast_t *mem = mt_create_ast(arena, val, set_bit(ast_flag_enum_member) | set_bit(ast_flag_string));
|
||||
mem->string = val->string;
|
||||
mt_ast_append(n, mem);
|
||||
|
||||
@@ -273,13 +273,13 @@ fn ast_t *mt_parse_decls(ma_arena_t *arena, char *file, s8_t code) {
|
||||
}
|
||||
|
||||
if (parser_matchi(par, s8_lit("struct"))) {
|
||||
ast_t *n = mt_create_ast(par, pos, set_bit(ast_flag_string) | set_bit(ast_flag_struct));
|
||||
ast_t *n = mt_create_ast(arena, pos, set_bit(ast_flag_string) | set_bit(ast_flag_struct));
|
||||
mt_ast_append(result, n);
|
||||
n->string = parser_expect(par, lex_kind_ident)->string;
|
||||
|
||||
parser_expect(par, lex_kind_open_brace);
|
||||
while (par->at->kind != lex_kind_close_brace) {
|
||||
ast_t *mem = mt_create_ast(par, par->at, set_bit(ast_flag_struct_member) | set_bit(ast_flag_var) | set_bit(ast_flag_string));
|
||||
ast_t *mem = mt_create_ast(arena, par->at, set_bit(ast_flag_struct_member) | set_bit(ast_flag_var) | set_bit(ast_flag_string));
|
||||
mt_ast_append(n, mem);
|
||||
|
||||
ast_t *type = mt_parse_struct_mem(par, &mem->string);
|
||||
|
||||
Reference in New Issue
Block a user