meta parser better file line reporting
This commit is contained in:
@@ -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},
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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")` }
|
||||||
|
|||||||
2
todo.txt
2
todo.txt
@@ -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!!!!
|
||||||
|
|||||||
Reference in New Issue
Block a user