From 85a6c218b274bf36a735f0a029b48d9fcf220103 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Sat, 1 Feb 2025 08:35:04 +0100 Subject: [PATCH] meta parser better file line reporting --- src/app/app.gen.c | 2 +- src/app/app.gen.h | 2 +- src/app/app.meta.c | 8 +++----- src/core/core_ctx.c | 1 + src/core/core_lexer.c | 18 ++++++++++++++---- src/core/core_lexer.h | 3 ++- src/core/core_log.c | 12 +++++++++--- src/core/core_log.h | 2 +- src/meta/meta_format.c | 6 +++--- src/meta/meta_serialize_format.c | 2 +- src/meta/meta_table_format.c | 3 ++- src/ui/ui.meta.c | 4 ++-- todo.txt | 2 +- 13 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/app/app.gen.c b/src/app/app.gen.c index dde3dca..a555b09 100644 --- a/src/app/app.gen.c +++ b/src/app/app.gen.c @@ -228,7 +228,7 @@ app_key_t w32_map_wparam_to_app_key(WPARAM wparam) { 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), .members = (type_member_t[]){ {.name = s8_const_lit("app_mouse_button_null"), .value = app_mouse_button_null}, diff --git a/src/app/app.gen.h b/src/app/app.gen.h index d2c2a96..9308a21 100644 --- a/src/app/app.gen.h +++ b/src/app/app.gen.h @@ -71,7 +71,7 @@ app_key_page_up, app_key_page_down, app_key_count, } app_key_t; -/*C:\dev\wasm\src/app/app.meta.c*/ +/*C:\dev\wasm\src/app/app.meta.c(135)*/ typedef enum { app_mouse_button_null, app_mouse_button_left, diff --git a/src/app/app.meta.c b/src/app/app.meta.c index 038d009..9f0c682 100644 --- a/src/app/app.meta.c +++ b/src/app/app.meta.c @@ -5,9 +5,7 @@ void mt_app(ma_arena_t *arena) { sb8_printf(h, "// automatically generated using: " __FILE__ "\n"); sb8_printf(c, "// automatically generated using: " __FILE__ "\n"); - - - ast_t *keys = mtt_parse(arena, __FILE__, S8_CODE( + ast_t *keys = mtt_parse(arena, FILE_AND_LINE, S8_CODE( // javascript filter out { name js1 js2 jf windows1 windows2 } { null XXX XXX 1 XXX XXX } @@ -134,7 +132,7 @@ void mt_app(ma_arena_t *arena) { /////////////////////////////// // 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 { app_mouse_button_null, app_mouse_button_left, @@ -184,7 +182,7 @@ void mt_app(ma_arena_t *arena) { v2f32_t window_size; v2f32_t mouse_pos; f32 dpr; - + f64 delta; u64 frame; diff --git a/src/core/core_ctx.c b/src/core/core_ctx.c index e3f6aef..998cb25 100644 --- a/src/core/core_ctx.c +++ b/src/core/core_ctx.c @@ -3,6 +3,7 @@ gb_thread thread_ctx_t global_thread_context = { .break_on_fatal = true, .break_on_error = true, .break_on_warning = true, + .print_file_and_line = true, .log_proc = default_log_proc, } }; diff --git a/src/core/core_lexer.c b/src/core/core_lexer.c index b1020fc..ff4120d 100644 --- a/src/core/core_lexer.c +++ b/src/core/core_lexer.c @@ -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(); + b8 p = tcx->log.print_file_and_line; + tcx->log.print_file_and_line = false; + 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); } fn lex_t *parser_expect(parser_t *par, lex_kind_t 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; } fn lex_t *parser_expecti(parser_t *par, s8_t 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; } diff --git a/src/core/core_lexer.h b/src/core/core_lexer.h index cdcf26b..ed2f92d 100644 --- a/src/core/core_lexer.h +++ b/src/core/core_lexer.h @@ -149,6 +149,7 @@ typedef struct parser_t parser_t; struct parser_t { ma_arena_t *arena; lex_t *at; + b8 print_only_file; }; #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_matchi(parser_t *par, s8_t str); 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_including(parser_t *par, lex_kind_t kind); diff --git a/src/core/core_log.c b/src/core/core_log.c index 6df2fba..530884b 100644 --- a/src/core/core_log.c +++ b/src/core/core_log.c @@ -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) { 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) { case log_level_debug: case log_level_info: { os_console_log(s8_printf(scratch.arena, "%S\n", string).str); } break; 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(); } break; 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(); } break; 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(); } break; default_is_invalid; diff --git a/src/core/core_log.h b/src/core/core_log.h index 4291e2b..7070884 100644 --- a/src/core/core_log.h +++ b/src/core/core_log.h @@ -13,6 +13,7 @@ struct logger_t { b8 break_on_fatal; b8 break_on_error; 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 log_basef(log_level_t level, s8_t file_and_line, const char *str, ...); - #if PLATFORM_DEBUG_ASSERT #define assert(x) (!(x) && (os_error_box(FILE_AND_LINE ": assertion failed: " #x "\n"), debug_break())) #else diff --git a/src/meta/meta_format.c b/src/meta/meta_format.c index cb8fbbb..574bdc4 100644 --- a/src/meta/meta_format.c +++ b/src/meta/meta_format.c @@ -91,7 +91,7 @@ fn ast_t *mt_parse_lit_expr(parser_t *par) { parser_expect(par, lex_kind_close_paren); return result; } 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; } } @@ -160,11 +160,11 @@ fn i64 mt_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: 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 { 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); } return 0; diff --git a/src/meta/meta_serialize_format.c b/src/meta/meta_serialize_format.c index 345dc1c..db8b5fe 100644 --- a/src/meta/meta_serialize_format.c +++ b/src/meta/meta_serialize_format.c @@ -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); 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 { - parser_panicf(n->pos, "expected type"); + parser_panicf(false, n->pos, "expected type"); } return (s8_t){0}; } diff --git a/src/meta/meta_table_format.c b/src/meta/meta_table_format.c index 4cf6a13..bc6c558 100644 --- a/src/meta/meta_table_format.c +++ b/src/meta/meta_table_format.c @@ -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)) { break; } 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; @@ -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) { lex_array_t tokens = lex_tokens(arena, file, code); 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 *name_row = mt_create_ast(arena, par->at, set_bit(ast_flag_row)); mtt__parse_row(par, name_row); diff --git a/src/ui/ui.meta.c b/src/ui/ui.meta.c index b2fc560..94af671 100644 --- a/src/ui/ui.meta.c +++ b/src/ui/ui.meta.c @@ -1,5 +1,5 @@ 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 } { 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})` } @@ -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) { - 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 { type name skip init } { ui_id_t id 1 `ui_idf("root")` } diff --git a/todo.txt b/todo.txt index b02d02c..e37e4ed 100644 --- a/todo.txt +++ b/todo.txt @@ -76,7 +76,7 @@ [ ] ini format [x] remove dates and time from core [ ] 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] search for python snippets and execute meta.py script on that file [x] simplify logging!!!!