sammine-lang
Loading...
Searching...
No Matches
Ast.h
Go to the documentation of this file.
1#pragma once
2#include "ast/AstBase.h"
3#include "ast/AstDecl.h"
4#include "util/Utilities.h"
5#include <cassert>
6#include <cstddef>
7#include <memory>
8#include <string>
9#include <vector>
10
14
15namespace sammine_lang {
16
17namespace AST {
18
19using Identifier = std::string;
20class Printable {};
21
22class DefinitionAST : public AstBase, public Printable {};
23
24class ProgramAST : public AstBase, public Printable {
25public:
26 std::vector<std::unique_ptr<DefinitionAST>> DefinitionVec;
27 virtual std::string getTreeName() override { return "ProgramAST"; }
28 void accept_vis(ASTVisitor *visitor) override { visitor->visit(this); }
29 virtual void walk_with_preorder(ASTVisitor *visitor) override {
30 visitor->preorder_walk(this);
31 }
32 virtual void walk_with_postorder(ASTVisitor *visitor) override {
33 visitor->postorder_walk(this);
34 }
35 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
36 return visitor->synthesize(this);
37 }
38};
39
40class TypedVarAST : public AstBase, public Printable {
41public:
42 std::string name;
43 std::string type_lexeme;
44
45 explicit TypedVarAST(std::shared_ptr<Token> name,
46 std::shared_ptr<Token> type) {
47 this->join_location(name)->join_location(type);
48 if (name)
49 this->name = name->lexeme;
50 if (type)
51 this->type_lexeme = type->lexeme;
52 }
53 explicit TypedVarAST(std::shared_ptr<Token> name) {
54 this->join_location(name);
55 if (name)
56 this->name = name->lexeme;
57 }
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);
62 }
63 virtual void walk_with_postorder(ASTVisitor *visitor) override {
64 visitor->postorder_walk(this);
65 }
66
67 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
68 return visitor->synthesize(this);
69 }
70};
71
73
76class PrototypeAST : public AstBase, public Printable {
77public:
78 llvm::Function *function;
79 std::string functionName;
80 std::string returnType;
81 std::vector<std::unique_ptr<AST::TypedVarAST>> parameterVectors;
82
83 explicit PrototypeAST(
84 std::shared_ptr<Token> functionName, std::shared_ptr<Token> returnType,
85 std::vector<std::unique_ptr<AST::TypedVarAST>> parameterVectors) {
86 assert(functionName);
87 assert(returnType);
88 this->functionName = functionName->lexeme;
89 this->returnType = returnType->lexeme;
90 this->join_location(functionName)->join_location(returnType);
91
92 this->parameterVectors = std::move(parameterVectors);
93
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());
98 }
99
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);
106
107 this->parameterVectors = std::move(parameterVectors);
108
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());
113 }
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);
118 }
119 virtual void walk_with_postorder(ASTVisitor *visitor) override {
120 visitor->postorder_walk(this);
121 }
122 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
123 return visitor->synthesize(this);
124 }
125};
126
129class ExternAST : public DefinitionAST {
130public:
131 std::unique_ptr<PrototypeAST> Prototype;
132
133 ExternAST(std::unique_ptr<PrototypeAST> Prototype)
134 : Prototype(std::move(Prototype)) {
135 this->join_location(this->Prototype.get());
136 }
137 void accept_vis(ASTVisitor *visitor) override { visitor->visit(this); }
138
139 virtual std::string getTreeName() override { return "ExternAST"; }
140 virtual void walk_with_preorder(ASTVisitor *visitor) override {
141 visitor->preorder_walk(this);
142 }
143 virtual void walk_with_postorder(ASTVisitor *visitor) override {
144 visitor->postorder_walk(this);
145 }
146 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
147 return visitor->synthesize(this);
148 }
149};
150class ExprAST : public AstBase, public Printable {
151public:
152 ~ExprAST() = default;
153};
154
158class BlockAST : public AstBase, public Printable {
159
160public:
161 std::vector<std::unique_ptr<ExprAST>> Statements;
162 virtual std::string getTreeName() override { return "BlockAST"; }
163 void accept_vis(ASTVisitor *visitor) override { visitor->visit(this); }
164 virtual void walk_with_preorder(ASTVisitor *visitor) override {
165 visitor->preorder_walk(this);
166 }
167 virtual void walk_with_postorder(ASTVisitor *visitor) override {
168 visitor->postorder_walk(this);
169 }
170 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
171 return visitor->synthesize(this);
172 }
173};
174
175class FuncDefAST : public DefinitionAST {
176public:
177 ~FuncDefAST() = default;
178 std::unique_ptr<PrototypeAST> Prototype;
179 std::unique_ptr<BlockAST> Block;
180
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());
186 }
187
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);
192 }
193 virtual void walk_with_postorder(ASTVisitor *visitor) override {
194 visitor->postorder_walk(this);
195 }
196 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
197 return visitor->synthesize(this);
198 }
199};
200
201// Record id { typed_var }
202class RecordDefAST : public DefinitionAST {
203public:
204 std::string record_name;
205 std::vector<std::unique_ptr<TypedVarAST>> record_members;
206 virtual std::string getTreeName() override { return "RecordDefAST"; }
207
208 explicit RecordDefAST(std::shared_ptr<Token> record_id,
209 decltype(record_members) record_members)
210 : record_members(std::move(record_members)) {
211 if (record_id)
212 record_name = record_id->lexeme;
213
214 this->join_location(record_id);
215 for (auto &m : record_members)
216 this->join_location(m.get());
217 }
218 void accept_vis(ASTVisitor *visitor) override { visitor->visit(this); }
219 virtual void walk_with_preorder(ASTVisitor *visitor) override {
220 visitor->preorder_walk(this);
221 }
222 virtual void walk_with_postorder(ASTVisitor *visitor) override {
223 visitor->postorder_walk(this);
224 }
225 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
226 return visitor->synthesize(this);
227 }
228};
229
231class VarDefAST : public ExprAST {
232public:
233 std::unique_ptr<TypedVarAST> TypedVar;
234 std::unique_ptr<ExprAST> Expression;
235
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)) {
240
241 this->join_location(let)
242 ->join_location(this->TypedVar.get())
243 ->join_location(this->Expression.get());
244 };
245
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);
250 }
251 virtual void walk_with_postorder(ASTVisitor *visitor) override {
252 visitor->postorder_walk(this);
253 }
254 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
255 return visitor->synthesize(this);
256 }
257};
258class NumberExprAST : public ExprAST {
259public:
260 std::string number;
261
262 explicit NumberExprAST(std::shared_ptr<Token> t) {
263 assert(t);
264 join_location(t);
265 number = t->lexeme;
266 }
267 virtual std::string getTreeName() override { return "NumberExprAST"; }
268 void accept_vis(ASTVisitor *visitor) override { visitor->visit(this); }
269 virtual void walk_with_preorder(ASTVisitor *visitor) override {
270 visitor->preorder_walk(this);
271 }
272 virtual void walk_with_postorder(ASTVisitor *visitor) override {
273 visitor->postorder_walk(this);
274 }
275 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
276 return visitor->synthesize(this);
277 }
278};
279class StringExprAST : public ExprAST {
280public:
281 std::string string_content;
282
283 explicit StringExprAST(std::shared_ptr<Token> t) {
284 assert(t);
285 join_location(t);
286 string_content = t->lexeme;
287 }
288 virtual std::string getTreeName() override { return "StringExprAST"; }
289 void accept_vis(ASTVisitor *visitor) override { visitor->visit(this); }
290 virtual void walk_with_preorder(ASTVisitor *visitor) override {
291 visitor->preorder_walk(this);
292 }
293 virtual void walk_with_postorder(ASTVisitor *visitor) override {
294 visitor->postorder_walk(this);
295 }
296 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
297 return visitor->synthesize(this);
298 }
299};
300
301class BoolExprAST : public ExprAST {
302public:
303 bool b;
304 BoolExprAST(bool b, sammine_util::Location loc) : b(b) {
305 this->location = loc;
306 }
307 virtual std::string getTreeName() override { return "BoolExprAST"; }
308 void accept_vis(ASTVisitor *visitor) override { visitor->visit(this); }
309 virtual void walk_with_preorder(ASTVisitor *visitor) override {
310 visitor->preorder_walk(this);
311 }
312 virtual void walk_with_postorder(ASTVisitor *visitor) override {
313 visitor->postorder_walk(this);
314 }
315 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
316 return visitor->synthesize(this);
317 }
318};
319class BinaryExprAST : public ExprAST {
320public:
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());
329 }
330
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);
335 }
336 virtual void walk_with_postorder(ASTVisitor *visitor) override {
337 visitor->postorder_walk(this);
338 }
339 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
340 return visitor->synthesize(this);
341 }
342};
343class ReturnExprAST : public ExprAST {
344
345public:
346 bool is_implicit;
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);
353 } else {
354 this->join_location(return_tok)->join_location(this->return_expr.get());
355 }
356 }
357
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());
361 }
362
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);
367 }
368 virtual void walk_with_postorder(ASTVisitor *visitor) override {
369 visitor->postorder_walk(this);
370 }
371 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
372 return visitor->synthesize(this);
373 }
374};
375class CallExprAST : public ExprAST {
376
377public:
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);
384 if (functionName)
385 this->functionName = functionName->lexeme;
386
387 for (auto &arg : arguments)
388 if (arg)
389 this->join_location(arg.get());
390 this->arguments = std::move(arguments);
391 }
392
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);
397 }
398 virtual void walk_with_postorder(ASTVisitor *visitor) override {
399 visitor->postorder_walk(this);
400 }
401 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
402 return visitor->synthesize(this);
403 }
404};
405
406class UnitExprAST : public ExprAST {
407
408public:
409 bool is_implicit;
410
411 explicit UnitExprAST(std::shared_ptr<Token> left_paren,
412 std::shared_ptr<Token> right_paren)
413 : is_implicit(false) {
414 assert(left_paren);
415 assert(right_paren);
416 this->join_location(left_paren)->join_location(right_paren);
417 };
418 explicit UnitExprAST() : is_implicit(true) {}
419
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);
424 }
425 virtual void walk_with_postorder(ASTVisitor *visitor) override {
426 visitor->postorder_walk(this);
427 }
428 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
429 return visitor->synthesize(this);
430 }
431};
432class IfExprAST : public ExprAST {
433public:
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());
444 }
445
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);
450 }
451 virtual void walk_with_postorder(ASTVisitor *visitor) override {
452 visitor->postorder_walk(this);
453 }
454 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
455 return visitor->synthesize(this);
456 }
457};
458class VariableExprAST : public ExprAST {
459public:
460 std::string variableName;
461 VariableExprAST(std::shared_ptr<Token> var) {
462 join_location(var);
463 if (var)
464 variableName = var->lexeme;
465 };
466
467 virtual std::string getTreeName() override { return "VariableExprAST"; }
468 void accept_vis(ASTVisitor *visitor) override { visitor->visit(this); }
469 virtual void walk_with_preorder(ASTVisitor *visitor) override {
470 visitor->preorder_walk(this);
471 }
472 virtual void walk_with_postorder(ASTVisitor *visitor) override {
473 visitor->postorder_walk(this);
474 }
475 virtual Type accept_synthesis(TypeCheckerVisitor *visitor) override {
476 return visitor->synthesize(this);
477 }
478};
479} // namespace AST
480} // namespace sammine_lang
Defines the AST Abstract class for printing out AST Nodes.
Holds declaration for all the AST Nodes.
Holds classes and functionalities for dealing with Error handling, source locations caching & indexin...
Definition AstBase.h:32
Definition AstBase.h:191
An AST to simulate a { } code block.
Definition Ast.h:158
Definition Ast.h:150
Definition Ast.h:20
Definition Utilities.h:56
Definition Types.h:46