ExpPtr parseCall (Lexer& lex, ExpPtr in) { auto args = parseTuple(lex); ExpList exps; exps.reserve(args->subexps.size() + 1); exps.push_back(in); exps.insert(exps.end(), args->subexps.begin(), args->subexps.end()); return Exp::make(eCall, exps, in->span + args->span); }
ExpPtr parseLoop (Lexer& lex) { Span spStart, spEnd; ExpPtr body; spStart = lex.eat(tLoop).span; ExpList sub; sub.reserve(2); if (lex.current() == tLCurl) { sub.push_back(body = parseBlock(lex)); } else { sub.push_back(parseExp(lex)); sub.push_back(body = parseBlock(lex)); } spEnd = body->span; return Exp::make(eLoop, std::move(sub), spStart + spEnd); }