X-Git-Url: http://git.lukelau.me/?p=kaleidoscope.git;a=blobdiff_plain;f=Kaleidoscope%2Fast.hpp;fp=Kaleidoscope%2Fast.hpp;h=34a52258085b9d3fcd48453e9e5896f2c2b2c02d;hp=0000000000000000000000000000000000000000;hb=5f81038886345b9c1e130bc7cfdd463e76b37b84;hpb=400fd8ffcac74658d4323ba0b6f3519204075baa diff --git a/Kaleidoscope/ast.hpp b/Kaleidoscope/ast.hpp new file mode 100644 index 0000000..34a5225 --- /dev/null +++ b/Kaleidoscope/ast.hpp @@ -0,0 +1,79 @@ +#include +#include +#include "llvm/IR/Value.h" +#include "llvm/IR/Function.h" + +using namespace llvm; + +class ExprAST { +public: + virtual ~ExprAST() = default; + virtual Value *codegen() = 0; +}; + +class NumberExprAST: public ExprAST { + double Val; + +public: + NumberExprAST(double Val): Val(Val) {} + virtual Value *codegen(); +}; + +class VariableExprAST: public ExprAST { + std::string Name; + +public: + VariableExprAST(const std::string &Name): Name(Name) {} + virtual Value *codegen(); +}; + +class BinaryExprAST: public ExprAST { + char Op; + std::unique_ptr LHS, RHS; + +public: + BinaryExprAST(char op, std::unique_ptr LHS, + std::unique_ptr RHS) + : Op(op), LHS(std::move(LHS)), RHS(std::move(RHS)) {} + virtual Value *codegen(); +}; + +class CallExprAST: public ExprAST { + std::string Callee; + std::vector> Args; + +public: + CallExprAST(std::string &Callee, std::vector> Args) + : Callee(Callee), Args(std::move(Args)) {} + virtual Value *codegen(); +}; + +/* + Captures the prototype for a function + which is basically its name and arguments + */ +class PrototypeAST { + std::string Name; + std::vector Args; + +public: + virtual ~PrototypeAST() = default; + PrototypeAST(std::string Name, std::vector Args) + : Name(Name), Args(std::move(Args)) {} + + const std::string &getName() const { return Name; } + virtual Function *codegen(); +}; + +class FunctionAST { + std::unique_ptr Prototype; + std::unique_ptr Body; + +public: + virtual ~FunctionAST() = default; + FunctionAST(std::unique_ptr Prototype, std::unique_ptr Body) + : Prototype(std::move(Prototype)), Body(std::move(Body)) {} + virtual Function *codegen(); +}; + +std::unique_ptr LogError(const char *Str);