43 std::string type_lexeme;
45 explicit TypedVarAST(std::shared_ptr<Token> name,
46 std::shared_ptr<Token> type) {
47 this->join_location(name)->join_location(type);
49 this->name = name->lexeme;
51 this->type_lexeme = type->lexeme;
53 explicit TypedVarAST(std::shared_ptr<Token> name) {
54 this->join_location(name);
56 this->name = name->lexeme;
58 virtual std::string getTreeName()
override {
return "TypedVarAST"; }
59 void accept_vis(
ASTVisitor *visitor)
override { visitor->visit(
this); }
60 virtual void walk_with_preorder(
ASTVisitor *visitor)
override {
61 visitor->preorder_walk(
this);
63 virtual void walk_with_postorder(
ASTVisitor *visitor)
override {
64 visitor->postorder_walk(
this);
68 return visitor->synthesize(
this);
78 llvm::Function *function;
79 std::string functionName;
80 std::string returnType;
81 std::vector<std::unique_ptr<AST::TypedVarAST>> parameterVectors;
83 explicit PrototypeAST(
84 std::shared_ptr<Token> functionName, std::shared_ptr<Token> returnType,
85 std::vector<std::unique_ptr<AST::TypedVarAST>> parameterVectors) {
88 this->functionName = functionName->lexeme;
89 this->returnType = returnType->lexeme;
90 this->join_location(functionName)->join_location(returnType);
92 this->parameterVectors = std::move(parameterVectors);
94 for (
size_t i = 0; i < this->parameterVectors.size(); i++)
95 assert(this->parameterVectors[i]);
96 for (
size_t i = 0; i < this->parameterVectors.size(); i++)
97 this->join_location(this->parameterVectors[i]->get_location());
100 explicit PrototypeAST(
101 std::shared_ptr<Token> functionName,
102 std::vector<std::unique_ptr<AST::TypedVarAST>> parameterVectors) {
103 assert(functionName);
104 this->functionName = functionName->lexeme;
105 this->join_location(functionName);
107 this->parameterVectors = std::move(parameterVectors);
109 for (
size_t i = 0; i < this->parameterVectors.size(); i++)
110 assert(this->parameterVectors[i]);
111 for (
size_t i = 0; i < this->parameterVectors.size(); i++)
112 this->join_location(this->parameterVectors[i]->get_location());
114 virtual std::string getTreeName()
override {
return "PrototypeAST"; }
115 void accept_vis(
ASTVisitor *visitor)
override { visitor->visit(
this); }
116 virtual void walk_with_preorder(
ASTVisitor *visitor)
override {
117 visitor->preorder_walk(
this);
119 virtual void walk_with_postorder(
ASTVisitor *visitor)
override {
120 visitor->postorder_walk(
this);
123 return visitor->synthesize(
this);
177 ~FuncDefAST() =
default;
178 std::unique_ptr<PrototypeAST> Prototype;
179 std::unique_ptr<BlockAST> Block;
181 FuncDefAST(std::unique_ptr<PrototypeAST> Prototype,
182 std::unique_ptr<BlockAST> Block)
183 : Prototype(std::move(Prototype)), Block(std::move(Block)) {
184 this->join_location(this->Prototype.get())
185 ->join_location(this->Block.get());
188 virtual std::string getTreeName()
override {
return "FuncDefAST"; }
189 void accept_vis(
ASTVisitor *visitor)
override { visitor->visit(
this); }
190 virtual void walk_with_preorder(
ASTVisitor *visitor)
override {
191 visitor->preorder_walk(
this);
193 virtual void walk_with_postorder(
ASTVisitor *visitor)
override {
194 visitor->postorder_walk(
this);
197 return visitor->synthesize(
this);
204 std::string record_name;
205 std::vector<std::unique_ptr<TypedVarAST>> record_members;
206 virtual std::string getTreeName()
override {
return "RecordDefAST"; }
208 explicit RecordDefAST(std::shared_ptr<Token> record_id,
209 decltype(record_members) record_members)
210 : record_members(std::move(record_members)) {
212 record_name = record_id->lexeme;
214 this->join_location(record_id);
215 for (
auto &m : record_members)
216 this->join_location(m.get());
218 void accept_vis(
ASTVisitor *visitor)
override { visitor->visit(
this); }
219 virtual void walk_with_preorder(
ASTVisitor *visitor)
override {
220 visitor->preorder_walk(
this);
222 virtual void walk_with_postorder(
ASTVisitor *visitor)
override {
223 visitor->postorder_walk(
this);
226 return visitor->synthesize(
this);
233 std::unique_ptr<TypedVarAST> TypedVar;
234 std::unique_ptr<ExprAST> Expression;
236 explicit VarDefAST(std::shared_ptr<Token> let,
237 std::unique_ptr<TypedVarAST> TypedVar,
238 std::unique_ptr<ExprAST> Expression)
239 : TypedVar(std::move(TypedVar)), Expression(std::move(Expression)) {
241 this->join_location(let)
242 ->join_location(this->TypedVar.get())
243 ->join_location(this->Expression.get());
246 virtual std::string getTreeName()
override {
return "VarDefAST"; }
247 void accept_vis(
ASTVisitor *visitor)
override { visitor->visit(
this); }
248 virtual void walk_with_preorder(
ASTVisitor *visitor)
override {
249 visitor->preorder_walk(
this);
251 virtual void walk_with_postorder(
ASTVisitor *visitor)
override {
252 visitor->postorder_walk(
this);
255 return visitor->synthesize(
this);
321 std::shared_ptr<Token> Op;
322 std::unique_ptr<ExprAST> LHS, RHS;
323 BinaryExprAST(std::shared_ptr<Token> op, std::unique_ptr<ExprAST> LHS,
324 std::unique_ptr<ExprAST> RHS)
325 : Op(op), LHS(std::move(LHS)), RHS(std::move(RHS)) {
326 this->join_location(this->Op)
327 ->join_location(this->LHS.get())
328 ->join_location(this->RHS.get());
331 virtual std::string getTreeName()
override {
return "BinaryExprAST"; }
332 void accept_vis(
ASTVisitor *visitor)
override { visitor->visit(
this); }
333 virtual void walk_with_preorder(
ASTVisitor *visitor)
override {
334 visitor->preorder_walk(
this);
336 virtual void walk_with_postorder(
ASTVisitor *visitor)
override {
337 visitor->postorder_walk(
this);
340 return visitor->synthesize(
this);
347 std::unique_ptr<ExprAST> return_expr;
348 ReturnExprAST(std::shared_ptr<Token> return_tok,
349 std::unique_ptr<ExprAST> return_expr)
350 : is_implicit(
false), return_expr(std::move(return_expr)) {
351 if (return_expr ==
nullptr) {
352 this->join_location(return_tok);
354 this->join_location(return_tok)->join_location(this->return_expr.get());
358 ReturnExprAST(std::unique_ptr<ExprAST> return_expr)
359 : is_implicit(
true), return_expr(std::move(return_expr)) {
360 this->join_location(this->return_expr.get());
363 virtual std::string getTreeName()
override {
return "ReturnExprAST"; }
364 void accept_vis(
ASTVisitor *visitor)
override { visitor->visit(
this); }
365 virtual void walk_with_preorder(
ASTVisitor *visitor)
override {
366 visitor->preorder_walk(
this);
368 virtual void walk_with_postorder(
ASTVisitor *visitor)
override {
369 visitor->postorder_walk(
this);
372 return visitor->synthesize(
this);
378 std::string functionName;
379 std::vector<std::unique_ptr<AST::ExprAST>> arguments;
380 explicit CallExprAST(
381 std::shared_ptr<Token> functionName,
382 std::vector<std::unique_ptr<AST::ExprAST>> arguments = {}) {
383 join_location(functionName);
385 this->functionName = functionName->lexeme;
387 for (
auto &arg : arguments)
389 this->join_location(arg.get());
390 this->arguments = std::move(arguments);
393 virtual std::string getTreeName()
override {
return "CallExprAST"; }
394 void accept_vis(
ASTVisitor *visitor)
override { visitor->visit(
this); }
395 virtual void walk_with_preorder(
ASTVisitor *visitor)
override {
396 visitor->preorder_walk(
this);
398 virtual void walk_with_postorder(
ASTVisitor *visitor)
override {
399 visitor->postorder_walk(
this);
402 return visitor->synthesize(
this);
411 explicit UnitExprAST(std::shared_ptr<Token> left_paren,
412 std::shared_ptr<Token> right_paren)
413 : is_implicit(
false) {
416 this->join_location(left_paren)->join_location(right_paren);
418 explicit UnitExprAST() : is_implicit(
true) {}
420 virtual std::string getTreeName()
override {
return "UnitExpr"; }
421 void accept_vis(
ASTVisitor *visitor)
override { visitor->visit(
this); }
422 virtual void walk_with_preorder(
ASTVisitor *visitor)
override {
423 visitor->preorder_walk(
this);
425 virtual void walk_with_postorder(
ASTVisitor *visitor)
override {
426 visitor->postorder_walk(
this);
429 return visitor->synthesize(
this);
434 std::unique_ptr<ExprAST> bool_expr;
435 std::unique_ptr<BlockAST> thenBlockAST, elseBlockAST;
436 explicit IfExprAST(std::unique_ptr<ExprAST> bool_expr,
437 std::unique_ptr<BlockAST> thenBlockAST,
438 std::unique_ptr<BlockAST> elseBlockAST)
439 : bool_expr(std::move(bool_expr)), thenBlockAST(std::move(thenBlockAST)),
440 elseBlockAST(std::move(elseBlockAST)) {
441 this->join_location(this->bool_expr.get())
442 ->join_location(this->thenBlockAST.get())
443 ->join_location(this->elseBlockAST.get());
446 virtual std::string getTreeName()
override {
return "IfExpr"; }
447 void accept_vis(
ASTVisitor *visitor)
override { visitor->visit(
this); }
448 virtual void walk_with_preorder(
ASTVisitor *visitor)
override {
449 visitor->preorder_walk(
this);
451 virtual void walk_with_postorder(
ASTVisitor *visitor)
override {
452 visitor->postorder_walk(
this);
455 return visitor->synthesize(
this);