3 #include "llvm/IR/Value.h"
4 #include "llvm/IR/Function.h"
10 virtual ~ExprAST() = default;
11 virtual Value *codegen() = 0;
14 std::unique_ptr<ExprAST> LogError(std::string str);
16 class NumberExprAST: public ExprAST {
20 NumberExprAST(double Val): Val(Val) {}
21 virtual Value *codegen();
24 class VariableExprAST: public ExprAST {
28 VariableExprAST(const std::string &Name): Name(Name) {}
29 virtual Value *codegen();
32 class BinaryExprAST: public ExprAST {
34 std::unique_ptr<ExprAST> LHS, RHS;
37 BinaryExprAST(char op, std::unique_ptr<ExprAST> LHS,
38 std::unique_ptr<ExprAST> RHS)
39 : Op(op), LHS(std::move(LHS)), RHS(std::move(RHS)) {}
40 virtual Value *codegen();
43 class CallExprAST: public ExprAST {
45 std::vector<std::unique_ptr<ExprAST>> Args;
48 CallExprAST(std::string &Callee, std::vector<std::unique_ptr<ExprAST>> Args)
49 : Callee(Callee), Args(std::move(Args)) {}
50 virtual Value *codegen();
54 Captures the prototype for a function
55 which is basically its name and arguments
59 std::vector<std::string> Args;
64 virtual ~PrototypeAST() = default;
65 PrototypeAST(std::string Name, std::vector<std::string> Args,
66 bool IsOperator = false, unsigned Prec = 0)
67 : Name(Name), Args(std::move(Args)), IsOperator(IsOperator),
70 const std::string &getName() const { return Name; }
71 virtual Function *codegen();
73 bool isUnaryOp() const { return IsOperator && Args.size() == 1; }
74 bool isBinaryOp() const { return IsOperator && Args.size() == 2; }
76 char getOperatorName() const {
77 assert(isUnaryOp() || isBinaryOp());
78 return Name[Name.size() - 1];
81 unsigned getBinaryPrecedence() const { return Precedence; }
85 std::unique_ptr<PrototypeAST> Prototype;
86 std::unique_ptr<ExprAST> Body;
89 virtual ~FunctionAST() = default;
90 FunctionAST(std::unique_ptr<PrototypeAST> Prototype, std::unique_ptr<ExprAST> Body)
91 : Prototype(std::move(Prototype)), Body(std::move(Body)) {}
92 virtual Function *codegen();
95 /// An expression for an if/then/else combo
96 class IfExprAST: public ExprAST {
97 std::unique_ptr<ExprAST> Cond, Then, Else;
100 IfExprAST(std::unique_ptr<ExprAST> Cond,
101 std::unique_ptr<ExprAST> Then,
102 std::unique_ptr<ExprAST> Else)
103 : Cond(std::move(Cond)), Then(std::move(Then)), Else(std::move(Else)) {}
105 Value *codegen() override;
108 /// An expression for a for loop
109 class ForExprAST: public ExprAST {
111 std::unique_ptr<ExprAST> Start, End, Step, Body;
114 ForExprAST(const std::string &VarName,
115 std::unique_ptr<ExprAST> Start,
116 std::unique_ptr<ExprAST> End,
117 std::unique_ptr<ExprAST> Step,
118 std::unique_ptr<ExprAST> Body)
120 Start(std::move(Start)),
122 Step(std::move(Step)),
123 Body(std::move(Body)) {}
125 Value *codegen() override;