aboutsummaryrefslogtreecommitdiff
BranchCommit messageAuthorAge
mainfinal macro_ov45 days
 
LHS = std::make_unique<BinaryExprAST>(BinOp, std::move(LHS), std::move(RHS), Line); } } std::unique_ptr<ExprAST> Parser::ParseExpression() { auto LHS = ParseUnary(); if (!LHS) return nullptr; return ParseBinOpRHS(0, std::move(LHS)); } std::optional<std::vector<std::unique_ptr<ExprAST>>> Parser::ParseExprList(char CloseDelim, bool AllowEmpty) { std::vector<std::unique_ptr<ExprAST>> Elems; if (AllowEmpty && CurTok == CloseDelim) { getNextToken(); return Elems; } while (true) { auto E = ParseExpression(); if (!E) return std::nullopt; Elems.push_back(std::move(E)); if (CurTok == CloseDelim) break; if (CurTok != ',') { cps::sourceError(Lex.getLine(), "Expected ',' or '%c'", CloseDelim); return std::nullopt; } getNextToken(); } getNextToken(); return Elems; } // An optional parenthesized argument list; false means a diagnosed failure. bool Parser::ParseOptionalCallArgs(std::vector<std::unique_ptr<ExprAST>> &Args) { if (CurTok != '(') return true; getNextToken(); auto Parsed = ParseExprList(')', true); if (!Parsed) return false; Args = std::move(*Parsed); return true; } std::unique_ptr<ExprAST> 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<std::unique_ptr<ExprAST>> Args; if (!ParseOptionalCallArgs(Args)) return nullptr; return std::make_unique<NewExprAST>(ClassName, std::move(Args), Line); }