aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index f7e98d071..ba3369d7d 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -4470,6 +4470,33 @@ Ast *parse_stmt(AstFile *f) {
return s;
}
+ // Error correction statements
+ switch (token.kind) {
+ case Token_else:
+ expect_token(f, Token_else);
+ syntax_error(token, "'else' unattached to an 'if' statement");
+ switch (f->curr_token.kind) {
+ case Token_if:
+ return parse_if_stmt(f);
+ case Token_when:
+ return parse_when_stmt(f);
+ case Token_OpenBrace:
+ return parse_block_stmt(f, true);
+ case Token_do: {
+ Token arrow = expect_token(f, Token_do);
+ Ast *stmt = convert_stmt_to_body(f, parse_stmt(f));
+ if (build_context.disallow_do) {
+ syntax_error(stmt, "'do' has been disallowed");
+ }
+ return stmt;
+ } break;
+ default:
+ fix_advance_to_next_stmt(f);
+ return ast_bad_stmt(f, token, f->curr_token);
+ }
+ }
+
+
syntax_error(token, "Expected a statement, got '%.*s'", LIT(token_strings[token.kind]));
fix_advance_to_next_stmt(f);
return ast_bad_stmt(f, token, f->curr_token);