X-Git-Url: http://git.lukelau.me/?p=kaleidoscope.git;a=blobdiff_plain;f=Kaleidoscope%2Fast.hpp;h=7730f8ec0f630b54e8d2e6a0f92e32ec255da0d9;hp=34a52258085b9d3fcd48453e9e5896f2c2b2c02d;hb=HEAD;hpb=5f81038886345b9c1e130bc7cfdd463e76b37b84 diff --git a/Kaleidoscope/ast.hpp b/Kaleidoscope/ast.hpp index 34a5225..7730f8e 100644 --- a/Kaleidoscope/ast.hpp +++ b/Kaleidoscope/ast.hpp @@ -11,6 +11,8 @@ public: virtual Value *codegen() = 0; }; +std::unique_ptr LogError(std::string str); + class NumberExprAST: public ExprAST { double Val; @@ -48,21 +50,35 @@ public: virtual Value *codegen(); }; -/* +/** Captures the prototype for a function which is basically its name and arguments */ class PrototypeAST { std::string Name; std::vector Args; + bool IsOperator; + unsigned Precedence; public: virtual ~PrototypeAST() = default; - PrototypeAST(std::string Name, std::vector Args) - : Name(Name), Args(std::move(Args)) {} + PrototypeAST(std::string Name, std::vector Args, + bool IsOperator = false, unsigned Prec = 0) + : Name(Name), Args(std::move(Args)), IsOperator(IsOperator), + Precedence(Prec) {} const std::string &getName() const { return Name; } virtual Function *codegen(); + + bool isUnaryOp() const { return IsOperator && Args.size() == 1; } + bool isBinaryOp() const { return IsOperator && Args.size() == 2; } + + char getOperatorName() const { + assert(isUnaryOp() || isBinaryOp()); + return Name[Name.size() - 1]; + } + + unsigned getBinaryPrecedence() const { return Precedence; } }; class FunctionAST { @@ -76,4 +92,35 @@ public: virtual Function *codegen(); }; -std::unique_ptr LogError(const char *Str); +/// An expression for an if/then/else combo +class IfExprAST: public ExprAST { + std::unique_ptr Cond, Then, Else; + +public: + IfExprAST(std::unique_ptr Cond, + std::unique_ptr Then, + std::unique_ptr Else) + : Cond(std::move(Cond)), Then(std::move(Then)), Else(std::move(Else)) {} + + Value *codegen() override; +}; + +/// An expression for a for loop +class ForExprAST: public ExprAST { + std::string VarName; + std::unique_ptr Start, End, Step, Body; + +public: + ForExprAST(const std::string &VarName, + std::unique_ptr Start, + std::unique_ptr End, + std::unique_ptr Step, + std::unique_ptr Body) + : VarName(VarName), + Start(std::move(Start)), + End(std::move(End)), + Step(std::move(Step)), + Body(std::move(Body)) {} + + Value *codegen() override; +};