#ifndef __AST_HPP__ #define __AST_HPP__ 1 #include #include using namespace std; #include "llvm/IR/Module.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/Verifier.h" #include "llvm/IR/LegacyPassManager.h" #include "llvm/Transforms/Scalar.h" using namespace llvm; using namespace llvm::legacy; class ExprAST { public: virtual ~ExprAST(); virtual Value* codegen() const = 0; }; class NumberExprAST : public ExprAST { public: NumberExprAST(int v) :Val(v) {} Value* codegen() const; private: double Val; }; class VariableExprAST : public ExprAST { public: VariableExprAST(string s) :Name(s) {} string getName() const; Value* codegen() const; private: string Name; }; class InnerExprAST : public ExprAST { public: InnerExprAST(ExprAST* a); InnerExprAST(ExprAST* a, ExprAST* b); InnerExprAST(ExprAST* a, ExprAST* b, ExprAST* c); InnerExprAST(vector a); ~InnerExprAST(); protected: vector _nodes; private: InnerExprAST(const InnerExprAST& i); InnerExprAST& operator=(const InnerExprAST& i); }; class AddExprAST : public InnerExprAST { public: AddExprAST(ExprAST* a, ExprAST* b) :InnerExprAST(a, b) {} Value* codegen() const; }; class SubExprAST : public InnerExprAST { public: SubExprAST(ExprAST* a, ExprAST* b) :InnerExprAST(a, b) {} Value* codegen() const; }; class MulExprAST : public InnerExprAST { public: MulExprAST(ExprAST* a, ExprAST* b) :InnerExprAST(a, b) {} Value* codegen() const; }; class DivExprAST : public InnerExprAST { public: DivExprAST(ExprAST* a, ExprAST* b) :InnerExprAST(a, b) {} Value* codegen() const; }; class LtExprAST : public InnerExprAST { public: LtExprAST(ExprAST* a, ExprAST* b) :InnerExprAST(a, b) {} Value* codegen() const; }; class GtExprAST : public InnerExprAST { public: GtExprAST(ExprAST* a, ExprAST* b) :InnerExprAST(a, b) {} Value* codegen() const; }; class CallExprAST : public InnerExprAST { public: CallExprAST(string callee, vector v) :InnerExprAST(v), Callee(callee) {} Value* codegen() const; private: string Callee; }; class IfExprAST : public InnerExprAST { public: IfExprAST(ExprAST *a, ExprAST *b, ExprAST *c) :InnerExprAST(a, b, c) {} Value* codegen() const; }; class PrototypeAST { public: PrototypeAST(string n, vector a) :Name(n), Args(a) {} Function* codegen() const; string getName() const { return Name; } private: string Name; vector Args; }; class FunctionAST { public: FunctionAST(PrototypeAST p, ExprAST* b) :Proto(p), Body(b) {} ~FunctionAST(); Function* codegen() const; private: FunctionAST(const FunctionAST& f); FunctionAST& operator=(const FunctionAST &f); PrototypeAST Proto; ExprAST *Body; }; void InitializeModuleAndPassManager(void); #endif