Fixed some error handling and weird consume logic.

This commit is contained in:
2025-09-01 12:58:45 +02:00
parent 94fc3a4dad
commit 9e0728f952
3 changed files with 27 additions and 13 deletions

View File

@@ -420,13 +420,12 @@ consume :: (parse_state : *Parse_State, kind : Token_Kind, message : string) {
token := parse_state.previous; token := parse_state.previous;
advance_to_sync_point(parse_state); advance_to_sync_point(parse_state);
unexpected_token(parse_state, token, message); unexpected_token(parse_state, token, message);
if parse_state.current.kind == .TOKEN_EOF { if parse_state.current.kind == .TOKEN_EOF {
return; return;
} }
consume(parse_state, kind, message);
} }
//////////////////////////// ////////////////////////////
@@ -435,16 +434,21 @@ get_rule :: (kind : Token_Kind) -> *Parse_Rule {
return *parse_rules[kind]; 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); advance(parse_state);
prefix_rule := get_rule(parse_state.previous.kind).prefix; prefix_rule := get_rule(parse_state.previous.kind).prefix;
if prefix_rule == null { if prefix_rule == null {
tok_s : string; tok_s : string;
tok_s.data = parse_state.previous.source; tok_s.data = prev.source;
tok_s.count = parse_state.previous.length; 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)); expected_expression(parse_state, parse_state.previous, tprint("Expected expression after '%'.", tok_s));
// @Incomplete: Add error node here? }
return error_node(parse_state, "Expected expression."); 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.data = parse_state.previous.source;
tok_s.count = parse_state.previous.length; 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, 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? // @Incomplete: Add error node here?
return null; return null;
} }
@@ -677,8 +680,8 @@ floating :: (parse_state : *Parse_State, left : *AST_Node) -> *AST_Node {
return node; return node;
} }
expression :: (parse_state : *Parse_State) -> *AST_Node { expression :: (parse_state : *Parse_State, message : string = "") -> *AST_Node {
expression := precedence(parse_state, .PREC_ASSIGNMENT); expression := precedence(parse_state, .PREC_ASSIGNMENT, message);
return expression; return expression;
} }
@@ -900,12 +903,12 @@ statement :: (parse_state : *Parse_State) -> *AST_Node {
advance(parse_state); advance(parse_state);
consume(parse_state, .TOKEN_COLON, "Expect ':' after for loop iterator."); 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); add_child(node, begin_iter);
consume(parse_state, .TOKEN_DOTDOT, "Expect '..' after for loop iter left hand side."); 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); add_child(node, end_iter);
for_body := block(parse_state); for_body := block(parse_state);

6
test/for_no_iter.ink Normal file
View File

@@ -0,0 +1,6 @@
vertex main :: () {
x := 0.0;
for i : {
x += 2.0;
}
}

5
test/if_no_cond.ink Normal file
View File

@@ -0,0 +1,5 @@
vertex main :: () {
if {
}
}