From 74b6d06711afd3efbbc47436f1491900994313f3 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sat, 17 Oct 2026 06:54:32 +0000 Subject: feat(classes): allocate objects with NEW and rebind named class variables Co-Authored-By: Claude Opus 5.5 --- lib/Parser/ParserExpression.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'lib/Parser/ParserExpression.cc') diff --git a/lib/Parser/ParserExpression.cc b/lib/Parser/ParserExpression.cc index f4e074e..96132aa 100644 --- a/lib/Parser/ParserExpression.cc +++ b/lib/Parser/ParserExpression.cc @@ -168,6 +168,9 @@ std::unique_ptr Parser::ParsePrimary() { std::unique_ptr Parser::ParsePrimaryImpl() { switch (CurTok) { + case tok_new: + fprintf(stderr, "error: NEW is only allowed on the right of an assignment at line %d\n", Lex.getLine()); + return nullptr; case tok_identifier: return ParseIdentifierExpr(); case tok_number_int: return ParseNumberExpr(); case tok_number_real: return ParseNumberExpr(); @@ -299,3 +302,19 @@ std::optional>> Parser::ParseExprList(char getNextToken(); return Elems; } + +std::unique_ptr Parser::ParseAssignmentRHS() { + if (CurTok != tok_new) return ParseExpression(); + int Line = Lex.getLine(); + getNextToken(); + std::string ClassName = ParseTypeName(false); + if (ClassName.empty()) return nullptr; + std::vector> Args; + if (CurTok == '(') { + getNextToken(); + auto Parsed = ParseExprList(')', true); + if (!Parsed) return nullptr; + Args = std::move(*Parsed); + } + return std::make_unique(ClassName, std::move(Args), Line); +} -- cgit v1.3.1-4-g156e