Fixed some error handling and weird consume logic.
This commit is contained in:
25
Parsing.jai
25
Parsing.jai
@@ -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
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