Initial commit
[kaleidoscope.git] / Kaleidoscope / ast.hpp
diff --git a/Kaleidoscope/ast.hpp b/Kaleidoscope/ast.hpp
new file mode 100644 (file)
index 0000000..34a5225
--- /dev/null
@@ -0,0 +1,79 @@
+#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);