aboutsummaryrefslogtreecommitdiff
path: root/lib/Parser/ParserControlFlow.cc
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-22 15:11:15 +0000
committer_ov4 <ov4@ov4.org>2026-10-22 15:33:15 +0000
commitee615b2b3b2b7b336fdd4334dba68801681c9c7b (patch)
tree6a3d7047780e1bced0db07b22643c261290ad734 /lib/Parser/ParserControlFlow.cc
parent713a313b06256a13ddefa5e257e3b80f8aa808ba (diff)
fix(parser): accept bare NEXT and read its identifier only from the same line
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Diffstat (limited to 'lib/Parser/ParserControlFlow.cc')
-rw-r--r--lib/Parser/ParserControlFlow.cc19
1 files changed, 9 insertions, 10 deletions
diff --git a/lib/Parser/ParserControlFlow.cc b/lib/Parser/ParserControlFlow.cc
index feedf44..7caf555 100644
--- a/lib/Parser/ParserControlFlow.cc
+++ b/lib/Parser/ParserControlFlow.cc
@@ -124,18 +124,17 @@ std::unique_ptr<StmtAST> Parser::ParseForStmt() {
return nullptr;
}
getNextToken();
-
- if (CurTok != tok_identifier) {
- cps::sourceError(Lex.getLine(), "expected identifier after NEXT (e.g., NEXT %s)", VarName.c_str());
- return nullptr;
- }
- if (!sameIdentifier(Lex.IdentifierStr, VarName)) {
- cps::sourceError(Lex.getLine(), "NEXT identifier '%s' does not match FOR variable '%s'",
- Lex.IdentifierStr.c_str(), VarName.c_str());
- return nullptr;
+ // The identifier after NEXT is optional; one on the next line starts a
+ // new statement.
+ if (CurTok == tok_identifier && !StartsLine) {
+ if (!sameIdentifier(Lex.IdentifierStr, VarName)) {
+ cps::sourceError(Lex.getLine(), "NEXT identifier '%s' does not match FOR variable '%s'",
+ Lex.IdentifierStr.c_str(), VarName.c_str());
+ return nullptr;
+ }
+ getNextToken();
}
- getNextToken();
return std::make_unique<ForStmtAST>(VarName, std::move(Start), std::move(End), std::move(Step), std::move(Body));
}