#pragma once #include "cps/AST.h" #include #include #include #include namespace cps { class PrototypeAST { std::string Name; std::vector> Args; std::string ReturnType; bool IsExternal; public: PrototypeAST(const std::string &Name, std::vector> Args, const std::string &ReturnType, bool IsExternal = false) : Name(Name), Args(std::move(Args)), ReturnType(ReturnType), IsExternal(IsExternal) {} const std::string &getName() const { return Name; } const std::vector> &getArgs() const { return Args; } const std::string &getReturnType() const { return ReturnType; } bool isExternal() const { return IsExternal; } }; class FunctionDefAST : public StmtAST { std::unique_ptr Proto; std::vector> Body; public: FunctionDefAST(std::unique_ptr Proto, std::vector> Body) : Proto(std::move(Proto)), Body(std::move(Body)) {} PrototypeAST *getProto() const { return Proto.get(); } const std::vector> &getBody() const { return Body; } }; class CallExprAST : public ExprAST { std::string Callee; std::vector> Args; public: CallExprAST(const std::string &Callee, std::vector> Args) : Callee(Callee), Args(std::move(Args)) {} const std::string &getCallee() const { return Callee; } const std::vector> &getArgs() const { return Args; } }; class CallStmtAST : public StmtAST { std::string Callee; std::vector> Args; public: CallStmtAST(const std::string &Callee, std::vector> Args) : Callee(Callee), Args(std::move(Args)) {} const std::string &getCallee() const { return Callee; } const std::vector> &getArgs() const { return Args; } }; class ReturnStmtAST : public StmtAST { std::unique_ptr RetVal; public: ReturnStmtAST(std::unique_ptr RetVal = nullptr) : RetVal(std::move(RetVal)) {} ExprAST *getRetVal() const { return RetVal.get(); } }; } // namespace cps