meta parser better file line reporting

This commit is contained in:
Krzosa Karol
2025-02-01 08:35:04 +01:00
parent 942cff9a6b
commit 85a6c218b2
13 changed files with 41 additions and 24 deletions

View File

@@ -228,7 +228,7 @@ app_key_t w32_map_wparam_to_app_key(WPARAM wparam) {
default: {return app_key_null;} break; default: {return app_key_null;} break;
} }
} }
#endif/*C:\dev\wasm\src/app/app.meta.c*/ #endif/*C:\dev\wasm\src/app/app.meta.c(135)*/
type_t type__app_mouse_button_t = { type_kind_enum, s8_const_lit("app_mouse_button_t"), sizeof(app_mouse_button_t), type_t type__app_mouse_button_t = { type_kind_enum, s8_const_lit("app_mouse_button_t"), sizeof(app_mouse_button_t),
.members = (type_member_t[]){ .members = (type_member_t[]){
{.name = s8_const_lit("app_mouse_button_null"), .value = app_mouse_button_null}, {.name = s8_const_lit("app_mouse_button_null"), .value = app_mouse_button_null},

View File

@@ -71,7 +71,7 @@ app_key_page_up,
app_key_page_down, app_key_page_down,
app_key_count, app_key_count,
} app_key_t; } app_key_t;
/*C:\dev\wasm\src/app/app.meta.c*/ /*C:\dev\wasm\src/app/app.meta.c(135)*/
typedef enum { typedef enum {
app_mouse_button_null, app_mouse_button_null,
app_mouse_button_left, app_mouse_button_left,

View File

@@ -5,9 +5,7 @@ void mt_app(ma_arena_t *arena) {
sb8_printf(h, "// automatically generated using: " __FILE__ "\n"); sb8_printf(h, "// automatically generated using: " __FILE__ "\n");
sb8_printf(c, "// automatically generated using: " __FILE__ "\n"); sb8_printf(c, "// automatically generated using: " __FILE__ "\n");
ast_t *keys = mtt_parse(arena, FILE_AND_LINE, S8_CODE(
ast_t *keys = mtt_parse(arena, __FILE__, S8_CODE(
// javascript filter out // javascript filter out
{ name js1 js2 jf windows1 windows2 } { name js1 js2 jf windows1 windows2 }
{ null XXX XXX 1 XXX XXX } { null XXX XXX 1 XXX XXX }
@@ -134,7 +132,7 @@ void mt_app(ma_arena_t *arena) {
/////////////////////////////// ///////////////////////////////
// declaring app structures and generating type info // declaring app structures and generating type info
{ {
ast_t *decls = mt_parse_decls(arena, __FILE__, S8_CODE( ast_t *decls = mt_parse_decls(arena, FILE_AND_LINE, S8_CODE(
typedef enum { typedef enum {
app_mouse_button_null, app_mouse_button_null,
app_mouse_button_left, app_mouse_button_left,
@@ -184,7 +182,7 @@ void mt_app(ma_arena_t *arena) {
v2f32_t window_size; v2f32_t window_size;
v2f32_t mouse_pos; v2f32_t mouse_pos;
f32 dpr; f32 dpr;
f64 delta; f64 delta;
u64 frame; u64 frame;

View File

@@ -3,6 +3,7 @@ gb_thread thread_ctx_t global_thread_context = {
.break_on_fatal = true, .break_on_fatal = true,
.break_on_error = true, .break_on_error = true,
.break_on_warning = true, .break_on_warning = true,
.print_file_and_line = true,
.log_proc = default_log_proc, .log_proc = default_log_proc,
} }
}; };

View File

@@ -423,22 +423,32 @@ fn lex_t *parser_matchi(parser_t *par, s8_t str) {
} }
} }
fn void parser_panicf(lex_t *token, const char *str, ...) { fn void parser_panicf(b32 print_only_file, lex_t *token, const char *str, ...) {
ma_temp_t scratch = ma_begin_scratch(); ma_temp_t scratch = ma_begin_scratch();
b8 p = tcx->log.print_file_and_line;
tcx->log.print_file_and_line = false;
S8_FMT(scratch.arena, str, str8); S8_FMT(scratch.arena, str, str8);
fatalf("%s(%d:%d): error: %S", token->file, token->line, token->column, str8); if (print_only_file) {
fatalf("%s: error: %S", token->file, str8);
} else {
fatalf("%S(%d): error: %S", token->file, token->line, str8);
}
tcx->log.print_file_and_line = p;
ma_end_scratch(scratch); ma_end_scratch(scratch);
} }
fn lex_t *parser_expect(parser_t *par, lex_kind_t kind) { fn lex_t *parser_expect(parser_t *par, lex_kind_t kind) {
lex_t *token = parser_match(par, kind); lex_t *token = parser_match(par, kind);
if (!token) parser_panicf(par->at, "expected token kind: %S, got instead: %S", lex_kind_to_s8(kind), lex_kind_to_s8(par->at->kind)); if (!token) parser_panicf(par->print_only_file, par->at, "expected token kind: %S, got instead: %S", lex_kind_to_s8(kind), lex_kind_to_s8(par->at->kind));
return token; return token;
} }
fn lex_t *parser_expecti(parser_t *par, s8_t ident) { fn lex_t *parser_expecti(parser_t *par, s8_t ident) {
lex_t *token = parser_matchi(par, ident); lex_t *token = parser_matchi(par, ident);
if (!token) parser_panicf(par->at, "expected identifier: '%S'", ident); if (!token) parser_panicf(par->print_only_file, par->at, "expected identifier: '%S'", ident);
return token; return token;
} }

View File

@@ -149,6 +149,7 @@ typedef struct parser_t parser_t;
struct parser_t { struct parser_t {
ma_arena_t *arena; ma_arena_t *arena;
lex_t *at; lex_t *at;
b8 print_only_file;
}; };
#define parser_make(ARENA, TOKEN) &(parser_t){.arena = ARENA, .at = TOKEN} #define parser_make(ARENA, TOKEN) &(parser_t){.arena = ARENA, .at = TOKEN}
@@ -156,7 +157,7 @@ fn lex_t *parser_next(parser_t *par);
fn lex_t *parser_match(parser_t *par, lex_kind_t kind); fn lex_t *parser_match(parser_t *par, lex_kind_t kind);
fn lex_t *parser_matchi(parser_t *par, s8_t str); fn lex_t *parser_matchi(parser_t *par, s8_t str);
fn lex_t *parser_expect(parser_t *par, lex_kind_t kind); fn lex_t *parser_expect(parser_t *par, lex_kind_t kind);
fn void parser_panicf(lex_t *token, const char *str, ...); fn void parser_panicf(b32 print_only_file, lex_t *token, const char *str, ...);
fn void parser_eat_until(parser_t *par, lex_kind_t kind); fn void parser_eat_until(parser_t *par, lex_kind_t kind);
fn void parser_eat_including(parser_t *par, lex_kind_t kind); fn void parser_eat_including(parser_t *par, lex_kind_t kind);

View File

@@ -8,21 +8,27 @@ fn void log_basef(log_level_t level, s8_t file_and_line, const char *str, ...) {
fn void default_log_proc(log_level_t level, s8_t file_and_line, s8_t string) { fn void default_log_proc(log_level_t level, s8_t file_and_line, s8_t string) {
ma_temp_t scratch = ma_begin_scratch(); ma_temp_t scratch = ma_begin_scratch();
char *colon = ": ";
if (tcx->log.print_file_and_line == false) {
file_and_line.len = 0;
colon = "";
}
switch(level) { switch(level) {
case log_level_debug: case log_level_debug:
case log_level_info: { case log_level_info: {
os_console_log(s8_printf(scratch.arena, "%S\n", string).str); os_console_log(s8_printf(scratch.arena, "%S\n", string).str);
} break; } break;
case log_level_warning: { case log_level_warning: {
os_console_log(s8_printf(scratch.arena, "%S: warning: %S\n", file_and_line, string).str); os_console_log(s8_printf(scratch.arena, "%S%s%S\n", file_and_line, colon, string).str);
if (tcx->log.break_on_warning) debug_break(); if (tcx->log.break_on_warning) debug_break();
} break; } break;
case log_level_error: { case log_level_error: {
os_console_log(s8_printf(scratch.arena, "%S: error: %S\n", file_and_line, string).str); os_console_log(s8_printf(scratch.arena, "%S%s%S\n", file_and_line, colon, string).str);
if (tcx->log.break_on_error) debug_break(); if (tcx->log.break_on_error) debug_break();
} break; } break;
case log_level_fatal: { case log_level_fatal: {
os_error_box(s8_printf(scratch.arena, "%S: fatal error: %S\n", file_and_line, string).str); os_error_box(s8_printf(scratch.arena, "%S%s%S\n", file_and_line, colon, string).str);
if (tcx->log.break_on_fatal) debug_break(); if (tcx->log.break_on_fatal) debug_break();
} break; } break;
default_is_invalid; default_is_invalid;

View File

@@ -13,6 +13,7 @@ struct logger_t {
b8 break_on_fatal; b8 break_on_fatal;
b8 break_on_error; b8 break_on_error;
b8 break_on_warning; b8 break_on_warning;
b8 print_file_and_line;
}; };
/////////////////////////////// ///////////////////////////////
@@ -24,7 +25,6 @@ struct logger_t {
fn void default_log_proc(log_level_t level, s8_t file_and_line, s8_t string); fn void default_log_proc(log_level_t level, s8_t file_and_line, s8_t string);
fn void log_basef(log_level_t level, s8_t file_and_line, const char *str, ...); fn void log_basef(log_level_t level, s8_t file_and_line, const char *str, ...);
#if PLATFORM_DEBUG_ASSERT #if PLATFORM_DEBUG_ASSERT
#define assert(x) (!(x) && (os_error_box(FILE_AND_LINE ": assertion failed: " #x "\n"), debug_break())) #define assert(x) (!(x) && (os_error_box(FILE_AND_LINE ": assertion failed: " #x "\n"), debug_break()))
#else #else

View File

@@ -91,7 +91,7 @@ fn ast_t *mt_parse_lit_expr(parser_t *par) {
parser_expect(par, lex_kind_close_paren); parser_expect(par, lex_kind_close_paren);
return result; return result;
} else { } else {
parser_panicf(token, "got invalid token of kind: %S while parsing expression", lex_kind_to_s8(token->kind)); parser_panicf(par->print_only_file, token, "got invalid token of kind: %S while parsing expression", lex_kind_to_s8(token->kind));
return 0; return 0;
} }
} }
@@ -160,11 +160,11 @@ fn i64 mt_eval_const_expr(ast_t *expr) {
case lex_kind_modulo: return left % right; case lex_kind_modulo: return left % right;
case lex_kind_and: return left && right; case lex_kind_and: return left && right;
case lex_kind_or: return left || right; case lex_kind_or: return left || right;
default: parser_panicf(expr->pos, "unhandled binary operator: %S", lex_kind_to_s8(expr->integer)); default: parser_panicf(false, expr->pos, "unhandled binary operator: %S", lex_kind_to_s8(expr->integer));
} }
} else { } else {
ma_temp_t scratch = ma_begin_scratch(); ma_temp_t scratch = ma_begin_scratch();
parser_panicf(expr->pos, "unhandled ast in const expression evaluation: %S", mt_serial_ast_flag(scratch.arena, expr->flags)); parser_panicf(false, expr->pos, "unhandled ast in const expression evaluation: %S", mt_serial_ast_flag(scratch.arena, expr->flags));
ma_end_scratch(scratch); ma_end_scratch(scratch);
} }
return 0; return 0;

View File

@@ -109,7 +109,7 @@ fn s8_t mt_serial_ast_type_to_type_info(ma_arena_t *arena, ast_t *n) {
s8_t base = mt_serial_ast_type_to_type_info(arena, n->first); s8_t base = mt_serial_ast_type_to_type_info(arena, n->first);
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); 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 { } else {
parser_panicf(n->pos, "expected type"); parser_panicf(false, n->pos, "expected type");
} }
return (s8_t){0}; return (s8_t){0};
} }

View File

@@ -40,7 +40,7 @@ fn void mtt__parse_row(parser_t *par, ast_t *parent) {
} else if (parser_match(par, lex_kind_close_brace) || parser_match(par, lex_kind_eof)) { } else if (parser_match(par, lex_kind_close_brace) || parser_match(par, lex_kind_eof)) {
break; break;
} else { } else {
parser_panicf(par->at, "invalid token: %S", lex_kind_to_s8(par->at->kind)); parser_panicf(par->print_only_file, par->at, "invalid token: %S", lex_kind_to_s8(par->at->kind));
} }
if (parent->next) parent = parent->next; if (parent->next) parent = parent->next;
@@ -50,6 +50,7 @@ fn void mtt__parse_row(parser_t *par, ast_t *parent) {
fn ast_t *mtt_parse(ma_arena_t *arena, char *file, s8_t code) { fn ast_t *mtt_parse(ma_arena_t *arena, char *file, s8_t code) {
lex_array_t tokens = lex_tokens(arena, file, code); lex_array_t tokens = lex_tokens(arena, file, code);
parser_t *par = parser_make(arena, tokens.data); parser_t *par = parser_make(arena, tokens.data);
par->print_only_file = true;
ast_t *table = mt_create_ast(arena, par->at, 0); ast_t *table = mt_create_ast(arena, par->at, 0);
ast_t *name_row = mt_create_ast(arena, par->at, set_bit(ast_flag_row)); ast_t *name_row = mt_create_ast(arena, par->at, set_bit(ast_flag_row));
mtt__parse_row(par, name_row); mtt__parse_row(par, name_row);

View File

@@ -1,5 +1,5 @@
fn void mt_ui_colors(ma_arena_t *arena, sb8_t *c, sb8_t *h) { fn void mt_ui_colors(ma_arena_t *arena, sb8_t *c, sb8_t *h) {
ast_t *table = mtt_parse(arena, __FILE__, S8_CODE( ast_t *table = mtt_parse(arena, FILE_AND_LINE, S8_CODE(
{ name color } { name color }
{ rect `v4f32_hsla_to_rgba((v4f32_t){0.0f, 0.2f, 0.95f, 1.0f})` } { rect `v4f32_hsla_to_rgba((v4f32_t){0.0f, 0.2f, 0.95f, 1.0f})` }
{ rect_hot `v4f32_hsla_to_rgba((v4f32_t){0.0f, 0.5f, 0.95f, 1.0f})` } { rect_hot `v4f32_hsla_to_rgba((v4f32_t){0.0f, 0.5f, 0.95f, 1.0f})` }
@@ -31,7 +31,7 @@ fn void mt_ui_colors(ma_arena_t *arena, sb8_t *c, sb8_t *h) {
} }
fn void mt_ui_stacks(ma_arena_t *arena, sb8_t *c, sb8_t *h) { fn void mt_ui_stacks(ma_arena_t *arena, sb8_t *c, sb8_t *h) {
ast_t *table = mtt_parse(arena, __FILE__, S8_CODE( ast_t *table = mtt_parse(arena, FILE_AND_LINE, S8_CODE(
// skip = don't include in ui_box_t as field // skip = don't include in ui_box_t as field
{ type name skip init } { type name skip init }
{ ui_id_t id 1 `ui_idf("root")` } { ui_id_t id 1 `ui_idf("root")` }

View File

@@ -76,7 +76,7 @@
[ ] ini format [ ] ini format
[x] remove dates and time from core [x] remove dates and time from core
[ ] meta [ ] meta
[ ] parser errors should not point to location of fatalf call but to the code!!!!!!!!! [x] parser errors should not point to location of fatalf call but to the code!!!!!!!!!
[x] prototype something like templates, readable string generation [x] prototype something like templates, readable string generation
[x] search for python snippets and execute meta.py script on that file [x] search for python snippets and execute meta.py script on that file
[x] simplify logging!!!! [x] simplify logging!!!!