This commit is contained in:
krzosa
2024-12-30 16:09:02 +01:00
parent bfdd384f90
commit 578fa33605
21 changed files with 494 additions and 259 deletions

View File

@@ -84,7 +84,7 @@ ast_t *parse_lit_expr(parser_t *par) {
parser_expect(par, lex_kind_close_paren);
return result;
} else {
lex_panicf(token, "got invalid token of kind: %S while parsing expression", lex_kind_to_s8(token->kind));
parser_panicf(token, "got invalid token of kind: %S while parsing expression", lex_kind_to_s8(token->kind));
return 0;
}
}
@@ -130,7 +130,7 @@ ast_t *parse_expr(parser_t *par) {
return expr;
}
ast_t *parse_expr_str(ma_arena_t *arena, char *file_name, char *stream) {
ast_t *parse_expr_str(ma_arena_t *arena, char *file_name, s8_t stream) {
lex_array_t tokens = lex_tokens(arena, file_name, stream);
parser_t *par = parser_make(arena, tokens.data);
ast_t *result = parse_expr(par);
@@ -153,18 +153,18 @@ i64 eval_const_expr(ast_t *expr) {
case lex_kind_modulo: return left % right;
case lex_kind_and: return left && right;
case lex_kind_or: return left || right;
default: lex_panicf(expr->pos, "unhandled binary operator: %S", lex_kind_to_s8(expr->integer));
default: parser_panicf(expr->pos, "unhandled binary operator: %S", lex_kind_to_s8(expr->integer));
}
} else {
ma_temp_t scratch = ma_begin_scratch();
lex_panicf(expr->pos, "unhandled ast in const expression evaluation: %S", s8_serial_ast_flag_t(scratch.arena, expr->flags));
parser_panicf(expr->pos, "unhandled ast in const expression evaluation: %S", s8_serial_ast_flag_t(scratch.arena, expr->flags));
ma_end_scratch(scratch);
}
return 0;
}
#define test_expr(x) do {\
lex_array_t tokens = lex_tokens(scratch.arena, "parser_test", #x);\
lex_array_t tokens = lex_tokens(scratch.arena, "parser_test", s8_lit(#x));\
parser_t *par = parser_make(scratch.arena, tokens.data);\
ast_t *expr = parse_expr(par);\
assert(expr != NULL);\
@@ -194,7 +194,7 @@ ast_t *parse_struct_mem(parser_t *par, s8_t *name) {
while (parser_match(par, lex_kind_multiply)) {
ast_t *pointer = create_ast(par, par->at, set_bit(ast_flag_type_pointer) | set_bit(ast_flag_string));
ast_append(pointer, type);
pointer->string = s8_fmt(par->arena, "%S*", type->string);
pointer->string = s8_printf(par->arena, "%S*", type->string);
type = pointer;
}
@@ -207,9 +207,9 @@ ast_t *parse_struct_mem(parser_t *par, s8_t *name) {
if (num) {
array->flags |= set_bit(ast_flag_integer);
array->integer = (int)num->integer;
array->string = s8_fmt(par->arena, "%S[%d]", type->string, (int)array->integer);
array->string = s8_printf(par->arena, "%S[%d]", type->string, (int)array->integer);
} else {
array->string = s8_fmt(par->arena, "%S[]", type->string);
array->string = s8_printf(par->arena, "%S[]", type->string);
}
parser_expect(par, lex_kind_close_bracket);
type = array;
@@ -218,7 +218,7 @@ ast_t *parse_struct_mem(parser_t *par, s8_t *name) {
return type;
}
ast_t *parse_decls(ma_arena_t *arena, char *file, char *code) {
ast_t *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 = create_ast(par, par->at, set_bit(ast_flag_string));
@@ -271,7 +271,7 @@ ast_t *parse_decls(ma_arena_t *arena, char *file, char *code) {
return result;
}
ast_t *parse_table(ma_arena_t *arena, char *file, char *code) {
ast_t *parse_table(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 *table = create_ast(par, par->at, 0);
@@ -299,7 +299,7 @@ ast_t *parse_table(ma_arena_t *arena, char *file, char *code) {
} else if (parser_match(par, lex_kind_bit_or) || parser_match(par, lex_kind_eof)) {
break;
} else {
lex_panicf(par->at, "invalid token: %S", lex_kind_to_s8(par->at->kind));
parser_panicf(par->at, "invalid token: %S", lex_kind_to_s8(par->at->kind));
}
}
}

View File

@@ -3,12 +3,12 @@ s8_t s8_ast_to_cvar(ma_arena_t *arena, ast_t *ast, s8_t *name) {
return ast->string;
} else if (ast->flags & set_bit(ast_flag_type_pointer)) {
s8_t base = s8_ast_to_cvar(arena, ast->first, name);
return s8_fmt(arena, "%S*", base);
return s8_printf(arena, "%S*", base);
} else if (ast->flags & set_bit(ast_flag_type_array)) {
if (ast->flags & set_bit(ast_flag_integer)) {
*name = s8_fmt(arena, "%S[%d]", *name, ast->integer);
*name = s8_printf(arena, "%S[%d]", *name, ast->integer);
} else {
*name = s8_fmt(arena, "%S[%d]", *name, ast->integer);
*name = s8_printf(arena, "%S[%d]", *name, ast->integer);
}
s8_t base = s8_ast_to_cvar(arena, ast->first, name);
@@ -86,15 +86,15 @@ s8_t s8_serial_ast_to_code(ma_arena_t *arena, ast_t *n) {
s8_t s8_serial_ast_type_to_type_info(ma_arena_t *arena, ast_t *n) {
if (n->flags & set_bit(ast_flag_type_name)) {
return s8_fmt(arena, "type__%S", n->string);
return s8_printf(arena, "type__%S", n->string);
} else if (n->flags & set_bit(ast_flag_type_pointer)) {
s8_t base = s8_serial_ast_type_to_type_info(arena, n->first);
return s8_fmt(arena, "(type_t){type_kind_pointer, s8_const_lit(\"%S\"), sizeof(void *), .base = &%S}", n->string, base);
return s8_printf(arena, "(type_t){type_kind_pointer, s8_const_lit(\"%S\"), sizeof(void *), .base = &%S}", n->string, base);
} else if (n->flags & set_bit(ast_flag_type_array)) {
s8_t base = s8_serial_ast_type_to_type_info(arena, n->first);
return s8_fmt(arena, "(type_t){type_kind_array, s8_const_lit(\"%S\"), sizeof(%S), %d, .base = &%S}", n->string, n->string, (int)n->integer, base);
return s8_printf(arena, "(type_t){type_kind_array, s8_const_lit(\"%S\"), sizeof(%S), %d, .base = &%S}", n->string, n->string, (int)n->integer, base);
} else {
lex_panicf(n->pos, "expected type");
parser_panicf(n->pos, "expected type");
}
return (s8_t){0};
}
@@ -182,7 +182,7 @@ void sb8_serial_table_enum(sb8_t *c, sb8_t *h, ast_t *table, s8_t decl) {
int name_idx = row_findi(table->first, "name");
int value_idx = row_findi(table->first, "value");
s8_t name_t = s8_fmt(c->arena, "%S_t", decl);
s8_t name_t = s8_printf(c->arena, "%S_t", decl);
sb8_printf(h, "typedef enum {\n");
for (ast_t *row = table->first->next; row; row = row->next) {
@@ -219,6 +219,6 @@ void sb8_serial_table_enum(sb8_t *c, sb8_t *h, ast_t *table, s8_t decl) {
#define gen_h(arena) _gen_filename(arena, s8_lit(__FILE__), s8_lit("h"))
s8_t _gen_filename(ma_arena_t *arena, s8_t lit_file, s8_t ext) {
s8_t file_noext = s8_chop_last_period(s8_chop_last_period(lit_file));
s8_t file = s8_fmt(arena, "%S.gen.%S", file_noext, ext);
s8_t file = s8_printf(arena, "%S.gen.%S", file_noext, ext);
return file;
}