From 9e0728f952268b0dcfddfed220eaaeb3146f8294 Mon Sep 17 00:00:00 2001 From: Niels Bross Date: Mon, 1 Sep 2025 12:58:45 +0200 Subject: [PATCH] Fixed some error handling and weird consume logic. --- Parsing.jai | 29 ++++++++++++++++------------- test/for_no_iter.ink | 6 ++++++ test/if_no_cond.ink | 5 +++++ 3 files changed, 27 insertions(+), 13 deletions(-) create mode 100644 test/for_no_iter.ink create mode 100644 test/if_no_cond.ink diff --git a/Parsing.jai b/Parsing.jai index 1c1b74d..196e103 100644 --- a/Parsing.jai +++ b/Parsing.jai @@ -321,7 +321,7 @@ advance_to_sync_point :: (parse_state : *Parse_State) { while true { if parse_state.current.kind == .TOKEN_SEMICOLON || parse_state.current.kind == .TOKEN_RIGHTBRACE || parse_state.current.kind == .TOKEN_LEFTBRACE || parse_state.current.kind == .TOKEN_EOF { - break; + break; } advance(parse_state); } @@ -420,13 +420,12 @@ consume :: (parse_state : *Parse_State, kind : Token_Kind, message : string) { token := parse_state.previous; advance_to_sync_point(parse_state); + unexpected_token(parse_state, token, message); if parse_state.current.kind == .TOKEN_EOF { return; } - - consume(parse_state, kind, message); } //////////////////////////// @@ -435,16 +434,21 @@ get_rule :: (kind : Token_Kind) -> *Parse_Rule { return *parse_rules[kind]; } -precedence :: (parse_state : *Parse_State, precedence : Precedence) -> *AST_Node { +precedence :: (parse_state : *Parse_State, precedence : Precedence, message : string = "") -> *AST_Node { + prev := parse_state.previous; advance(parse_state); prefix_rule := get_rule(parse_state.previous.kind).prefix; if prefix_rule == null { tok_s : string; - tok_s.data = parse_state.previous.source; - tok_s.count = parse_state.previous.length; - expected_expression(parse_state, parse_state.previous, tprint("Expected expression after '%'.", tok_s)); - // @Incomplete: Add error node here? + tok_s.data = prev.source; + tok_s.count = prev.length; + if message { + expected_expression(parse_state, parse_state.previous, tprint("Expected expression after '%'. %", tok_s, message)); + } else { + expected_expression(parse_state, parse_state.previous, tprint("Expected expression after '%'.", tok_s)); + } + return error_node(parse_state, "Expected expression."); } @@ -457,7 +461,6 @@ precedence :: (parse_state : *Parse_State, precedence : Precedence) -> *AST_Node tok_s.data = parse_state.previous.source; tok_s.count = parse_state.previous.length; expected_expression(parse_state, parse_state.current, tprint("Reached end of file. Expected expression after '%'.", tok_s)); - // expected_expression(parse_state, parse_state.current, "Reached end of file. Expected expression."); // @Incomplete: Add error node here? return null; } @@ -677,8 +680,8 @@ floating :: (parse_state : *Parse_State, left : *AST_Node) -> *AST_Node { return node; } -expression :: (parse_state : *Parse_State) -> *AST_Node { - expression := precedence(parse_state, .PREC_ASSIGNMENT); +expression :: (parse_state : *Parse_State, message : string = "") -> *AST_Node { + expression := precedence(parse_state, .PREC_ASSIGNMENT, message); return expression; } @@ -900,12 +903,12 @@ statement :: (parse_state : *Parse_State) -> *AST_Node { advance(parse_state); consume(parse_state, .TOKEN_COLON, "Expect ':' after for loop iterator."); - begin_iter := expression(parse_state); + begin_iter := expression(parse_state, "Expected beginning of iterator."); add_child(node, begin_iter); consume(parse_state, .TOKEN_DOTDOT, "Expect '..' after for loop iter left hand side."); - end_iter := expression(parse_state); + end_iter := expression(parse_state, "Expected end of iterator"); add_child(node, end_iter); for_body := block(parse_state); diff --git a/test/for_no_iter.ink b/test/for_no_iter.ink new file mode 100644 index 0000000..43ecb70 --- /dev/null +++ b/test/for_no_iter.ink @@ -0,0 +1,6 @@ +vertex main :: () { + x := 0.0; + for i : { + x += 2.0; + } +} diff --git a/test/if_no_cond.ink b/test/if_no_cond.ink new file mode 100644 index 0000000..5ebeef7 --- /dev/null +++ b/test/if_no_cond.ink @@ -0,0 +1,5 @@ +vertex main :: () { + if { + + } +}