aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-08-22 11:27:24 +0100
committergingerBill <bill@gingerbill.org>2021-08-22 11:27:24 +0100
commit93b5befe45b6464f30f7a9404d1db2d84edf201f (patch)
tree029888516919d4dd99f1a36af6d5b483cf66d1dc
parent01a888fcedbdcfa4bd86de6e3346104cad8faa8a (diff)
Improve error handling for missing semicolon separators in a `for` loop
-rw-r--r--core/odin/parser/parser.odin24
-rw-r--r--src/parser.cpp26
2 files changed, 36 insertions, 14 deletions
diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin
index 8bf159778..6bcb564fe 100644
--- a/core/odin/parser/parser.odin
+++ b/core/odin/parser/parser.odin
@@ -848,12 +848,24 @@ parse_for_stmt :: proc(p: ^Parser) -> ^ast.Stmt {
if !is_range && parse_control_statement_semicolon_separator(p) {
init = cond;
cond = nil;
- if p.curr_tok.kind != .Semicolon {
- cond = parse_simple_stmt(p, nil);
- }
- expect_semicolon(p, cond);
- if p.curr_tok.kind != .Open_Brace && p.curr_tok.kind != .Do {
- post = parse_simple_stmt(p, nil);
+
+
+ if f.curr_tok.kind == .Open_Brace || f.curr_tok.kind == .Do {
+ error(p, f.curr_tok.pos, "Expected ';', followed by a condition expression and post statement, got %s", token.tokens[f.curr_tok.kind]);
+ } else {
+ if p.curr_tok.kind != .Semicolon {
+ cond = parse_simple_stmt(p, nil);
+ }
+
+ if p.curr_tok.text != ";" {
+ error(p, p.curr_tok.pos, "Expected ';', got %s", tokenizer.token_to_string(p.curr_tok));
+ } else {
+ expect_semicolon(p, nil);
+ }
+
+ if p.curr_tok.kind != .Open_Brace && p.curr_tok.kind != .Do {
+ post = parse_simple_stmt(p, nil);
+ }
}
}
}
diff --git a/src/parser.cpp b/src/parser.cpp
index 6184a62ab..e9efd989a 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -4133,16 +4133,26 @@ Ast *parse_for_stmt(AstFile *f) {
if (!is_range && parse_control_statement_semicolon_separator(f)) {
init = cond;
cond = nullptr;
- if (f->curr_token.kind != Token_Semicolon) {
- cond = parse_simple_stmt(f, StmtAllowFlag_None);
- }
- expect_semicolon(f, cond);
- if (f->curr_token.kind != Token_OpenBrace &&
- f->curr_token.kind != Token_do) {
- post = parse_simple_stmt(f, StmtAllowFlag_None);
+
+ if (f->curr_token.kind == Token_OpenBrace || f->curr_token.kind == Token_do) {
+ syntax_error(f->curr_token, "Expected ';', followed by a condition expression and post statement, got %.*s", LIT(token_strings[f->curr_token.kind]));
+ } else {
+ if (f->curr_token.kind != Token_Semicolon) {
+ cond = parse_simple_stmt(f, StmtAllowFlag_None);
+ }
+
+ if (f->curr_token.string != ";") {
+ syntax_error(f->curr_token, "Expected ';', got %.*s", LIT(token_to_string(f->curr_token)));
+ } else {
+ expect_semicolon(f, nullptr);
+ }
+
+ if (f->curr_token.kind != Token_OpenBrace &&
+ f->curr_token.kind != Token_do) {
+ post = parse_simple_stmt(f, StmtAllowFlag_None);
+ }
}
}
-
}