Fixed some error handling and weird consume logic.
This commit is contained in:
29
Parsing.jai
29
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);
|
||||
|
||||
6
test/for_no_iter.ink
Normal file
6
test/for_no_iter.ink
Normal file
@@ -0,0 +1,6 @@
|
||||
vertex main :: () {
|
||||
x := 0.0;
|
||||
for i : {
|
||||
x += 2.0;
|
||||
}
|
||||
}
|
||||
5
test/if_no_cond.ink
Normal file
5
test/if_no_cond.ink
Normal file
@@ -0,0 +1,5 @@
|
||||
vertex main :: () {
|
||||
if {
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user