diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-22 15:11:15 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-22 15:33:15 +0000 |
| commit | ee615b2b3b2b7b336fdd4334dba68801681c9c7b (patch) | |
| tree | 6a3d7047780e1bced0db07b22643c261290ad734 /lib/Parser | |
| parent | 713a313b06256a13ddefa5e257e3b80f8aa808ba (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')
| -rw-r--r-- | lib/Parser/ParserControlFlow.cc | 19 |
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)); } |
