aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-22 15:14:35 +0000
committer_ov4 <ov4@ov4.org>2026-10-22 15:33:15 +0000
commit17993103e1ba1d142205eb2e41291edebc0e3a89 (patch)
tree4a3208d9c0edb1bdd7ae317da0d6dd0d098279b6 /lib
parentcb62de1eba07d4c522213bdd8331686684b3468c (diff)
fix(parser): report missing THEN and ')' on the line that needs them
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/Parser/Parser.cc1
-rw-r--r--lib/Parser/ParserControlFlow.cc13
-rw-r--r--lib/Parser/ParserExpression.cc2
3 files changed, 10 insertions, 6 deletions
diff --git a/lib/Parser/Parser.cc b/lib/Parser/Parser.cc
index d17856b..ad2e408 100644
--- a/lib/Parser/Parser.cc
+++ b/lib/Parser/Parser.cc
@@ -30,6 +30,7 @@ Parser::Parser(Lexer &L) : Lex(L) {
void Parser::getNextToken() {
int PreviousLine = CurTok == tok_eof ? 0 : Lex.getLine();
+ PrevTokLine = PreviousLine;
CurTok = Lex.gettok();
StartsLine = Lex.getLine() != PreviousLine;
}
diff --git a/lib/Parser/ParserControlFlow.cc b/lib/Parser/ParserControlFlow.cc
index 7caf555..542ef0e 100644
--- a/lib/Parser/ParserControlFlow.cc
+++ b/lib/Parser/ParserControlFlow.cc
@@ -26,10 +26,13 @@ std::unique_ptr<StmtAST> Parser::ParseIfStmt() {
if (!Cond) return nullptr;
if (CurTok != tok_then) {
- cps::sourceError(Lex.getLine(), "expected THEN");
- return nullptr;
+ cps::sourceError(missingLine(), "expected THEN");
+ // A THEN missing at the end of a line is reported and then treated as
+ // present so the rest of the statement still parses.
+ if (!StartsLine) return nullptr;
+ } else {
+ getNextToken();
}
- getNextToken();
std::vector<std::unique_ptr<StmtAST>> ThenStmts = ParseBlock({tok_else, tok_endif});
@@ -93,7 +96,7 @@ std::unique_ptr<StmtAST> Parser::ParseForStmt() {
getNextToken();
if (CurTok != tok_assign) {
- cps::sourceError(Lex.getLine(), "expected '<-' in FOR loop");
+ cps::sourceError(missingLine(), "expected '<-' in FOR loop");
return nullptr;
}
getNextToken();
@@ -102,7 +105,7 @@ std::unique_ptr<StmtAST> Parser::ParseForStmt() {
if (!Start) return nullptr;
if (CurTok != tok_to) {
- cps::sourceError(Lex.getLine(), "expected TO in FOR loop");
+ cps::sourceError(missingLine(), "expected TO in FOR loop");
return nullptr;
}
getNextToken();
diff --git a/lib/Parser/ParserExpression.cc b/lib/Parser/ParserExpression.cc
index 8c5e8ce..b75f704 100644
--- a/lib/Parser/ParserExpression.cc
+++ b/lib/Parser/ParserExpression.cc
@@ -211,7 +211,7 @@ std::unique_ptr<ExprAST> Parser::ParseParenExpr() {
auto V = ParseExpression();
if (!V) return nullptr;
if (CurTok != ')') {
- cps::sourceError(Lex.getLine(), "expected ')'");
+ cps::sourceError(missingLine(), "expected ')'");
return nullptr;
}
getNextToken();