--- /dev/null
+#include <string>
+#include <vector>
+#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<ExprAST> LHS, RHS;
+
+public:
+ BinaryExprAST(char op, std::unique_ptr<ExprAST> LHS,
+ std::unique_ptr<ExprAST> RHS)
+ : Op(op), LHS(std::move(LHS)), RHS(std::move(RHS)) {}
+ virtual Value *codegen();
+};
+
+class CallExprAST: public ExprAST {
+ std::string Callee;
+ std::vector<std::unique_ptr<ExprAST>> Args;
+
+public:
+ CallExprAST(std::string &Callee, std::vector<std::unique_ptr<ExprAST>> 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<std::string> Args;
+
+public:
+ virtual ~PrototypeAST() = default;
+ PrototypeAST(std::string Name, std::vector<std::string> Args)
+ : Name(Name), Args(std::move(Args)) {}
+
+ const std::string &getName() const { return Name; }
+ virtual Function *codegen();
+};
+
+class FunctionAST {
+ std::unique_ptr<PrototypeAST> Prototype;
+ std::unique_ptr<ExprAST> Body;
+
+public:
+ virtual ~FunctionAST() = default;
+ FunctionAST(std::unique_ptr<PrototypeAST> Prototype, std::unique_ptr<ExprAST> Body)
+ : Prototype(std::move(Prototype)), Body(std::move(Body)) {}
+ virtual Function *codegen();
+};
+
+std::unique_ptr<ExprAST> LogError(const char *Str);