34a52258085b9d3fcd48453e9e5896f2c2b2c02d
[kaleidoscope.git] / Kaleidoscope / ast.hpp
1 #include <string>
2 #include <vector>
3 #include "llvm/IR/Value.h"
4 #include "llvm/IR/Function.h"
5
6 using namespace llvm;
7
8 class ExprAST {
9 public:
10         virtual ~ExprAST() = default;
11         virtual Value *codegen() = 0;
12 };
13
14 class NumberExprAST: public ExprAST {
15         double Val;
16         
17 public:
18         NumberExprAST(double Val): Val(Val) {}
19         virtual Value *codegen();
20 };
21
22 class VariableExprAST: public ExprAST {
23         std::string Name;
24         
25 public:
26         VariableExprAST(const std::string &Name): Name(Name) {}
27         virtual Value *codegen();
28 };
29
30 class BinaryExprAST: public ExprAST {
31         char Op;
32         std::unique_ptr<ExprAST> LHS, RHS;
33         
34 public:
35         BinaryExprAST(char op, std::unique_ptr<ExprAST> LHS,
36                                   std::unique_ptr<ExprAST> RHS)
37         : Op(op), LHS(std::move(LHS)), RHS(std::move(RHS)) {}
38         virtual Value *codegen();
39 };
40
41 class CallExprAST: public ExprAST {
42         std::string Callee;
43         std::vector<std::unique_ptr<ExprAST>> Args;
44         
45 public:
46         CallExprAST(std::string &Callee, std::vector<std::unique_ptr<ExprAST>> Args)
47         : Callee(Callee), Args(std::move(Args)) {}
48         virtual Value *codegen();
49 };
50
51 /*
52  Captures the prototype for a function
53  which is basically its name and arguments
54  */
55 class PrototypeAST {
56         std::string Name;
57         std::vector<std::string> Args;
58         
59 public:
60         virtual ~PrototypeAST() = default;
61         PrototypeAST(std::string Name, std::vector<std::string> Args)
62         : Name(Name), Args(std::move(Args)) {}
63         
64         const std::string &getName() const { return Name; }
65         virtual Function *codegen();
66 };
67
68 class FunctionAST {
69         std::unique_ptr<PrototypeAST> Prototype;
70         std::unique_ptr<ExprAST> Body;
71         
72 public:
73         virtual ~FunctionAST() = default;
74         FunctionAST(std::unique_ptr<PrototypeAST> Prototype, std::unique_ptr<ExprAST> Body)
75         : Prototype(std::move(Prototype)), Body(std::move(Body)) {}
76         virtual Function *codegen();
77 };
78
79 std::unique_ptr<ExprAST> LogError(const char *Str);