From 5d5c14920a9aa3397d4b479c22e37392be5557f4 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Tue, 13 Oct 2026 08:47:52 +0000 Subject: feat: support comma-separated OUTPUT expressions Co-Authored-By: Claude Fable 5.1 --- lib/CodeGen/CodeGen.cc | 29 ++++++++++++++++------------- lib/Parser/Parser.cc | 12 +++++++++--- 2 files changed, 25 insertions(+), 16 deletions(-) (limited to 'lib') diff --git a/lib/CodeGen/CodeGen.cc b/lib/CodeGen/CodeGen.cc index d5942e9..c0da7ee 100644 --- a/lib/CodeGen/CodeGen.cc +++ b/lib/CodeGen/CodeGen.cc @@ -1138,20 +1138,23 @@ void CodeGen::emitStmt(StmtAST *Stmt) { } if (auto *Out = dynamic_cast(Stmt)) { - bool Handled = Arrays->tryEmitArrayOutput(Out->getExpr(), *this); - if (Handled) return; - - Value *Val = emitExpr(Out->getExpr()); - const TypeInfo *TypeInfo = getExprTypeInfo(Out->getExpr()); - if (!TypeInfo) { - reportError("Cannot infer the type of the OUTPUT expression"); - return; - } - if (TypeInfo->isVoid()) { - reportError("Cannot OUTPUT the result of a PROCEDURE call"); - return; + const auto &Exprs = Out->getExprs(); + for (size_t I = 0; I < Exprs.size(); ++I) { + ExprAST *Expr = Exprs[I].get(); + if (Arrays->tryEmitArrayOutput(Expr, *this)) continue; + + Value *Val = emitExpr(Expr); + const TypeInfo *TypeInfo = getExprTypeInfo(Expr); + if (!TypeInfo) { + reportError("Cannot infer the type of the OUTPUT expression"); + continue; + } + if (TypeInfo->isVoid()) { + reportError("Cannot OUTPUT the result of a PROCEDURE call"); + continue; + } + emitOutputValue(Val, TypeInfo, I + 1 == Exprs.size()); } - emitOutputValue(Val, TypeInfo, true); return; } diff --git a/lib/Parser/Parser.cc b/lib/Parser/Parser.cc index 260472c..25fc342 100644 --- a/lib/Parser/Parser.cc +++ b/lib/Parser/Parser.cc @@ -555,9 +555,15 @@ std::unique_ptr Parser::ParseStatementImpl() { } else if (CurTok == tok_output) { getNextToken(); - auto Expr = ParseExpression(); - if (!Expr) return nullptr; - return std::make_unique(std::move(Expr)); + std::vector> Exprs; + while (true) { + auto Expr = ParseExpression(); + if (!Expr) return nullptr; + Exprs.push_back(std::move(Expr)); + if (CurTok != ',') break; + getNextToken(); + } + return std::make_unique(std::move(Exprs)); } else if (CurTok == tok_if) { return ParseIfStmt(); -- cgit v1.3.1-4-g156e