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

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