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

@@ -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,
}
};

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();
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;
}

View File

@@ -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);

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) {
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;

View File

@@ -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