Line data Source code
1 : #include "../../../inc/visitors/codeGeneration/codeGeneration.h"
2 :
3 : #include "../../../inc/parsingAnalysis/ast/loops/ast_doWhile.h"
4 : #include "../../../inc/parsingAnalysis/ast/loops/ast_for.h"
5 : #include "../../../inc/parsingAnalysis/ast/loops/ast_pass.h"
6 : #include "../../../inc/parsingAnalysis/ast/loops/ast_stop.h"
7 : #include "../../../inc/parsingAnalysis/ast/loops/ast_while.h"
8 : #include <cstddef>
9 : #include <memory>
10 : #include <variant>
11 :
12 : namespace nicole {
13 :
14 : std::expected<std::shared_ptr<llvm::Value>, Error>
15 0 : CodeGeneration::visit(const AST_WHILE *node) const noexcept {
16 0 : if (!node) {
17 0 : return createError(ERROR_TYPE::NULL_NODE, "invalid AST_WHILE");
18 0 : }
19 0 : const auto condition{node->condition()->accept(*this)};
20 0 : if (!condition) {
21 0 : return createError(condition.error());
22 0 : }
23 0 : const auto result{node->body()->accept(*this)};
24 0 : if (!result) {
25 0 : return createError(result.error());
26 0 : }
27 0 : return {};
28 0 : }
29 :
30 : std::expected<std::shared_ptr<llvm::Value>, Error>
31 0 : CodeGeneration::visit(const AST_FOR *node) const noexcept {
32 0 : if (!node) {
33 0 : return createError(ERROR_TYPE::NULL_NODE, "invalid AST_FOR");
34 0 : }
35 0 : for (const auto &expr : node->init()) {
36 0 : const auto result{expr->accept(*this)};
37 0 : if (!result) {
38 0 : return createError(result.error());
39 0 : }
40 0 : }
41 0 : const auto condition{node->condition()->accept(*this)};
42 0 : if (!condition) {
43 0 : return createError(condition.error());
44 0 : }
45 0 : for (const auto &expr : node->update()) {
46 0 : const auto result{expr->accept(*this)};
47 0 : if (!result) {
48 0 : return createError(result.error());
49 0 : }
50 0 : }
51 0 : const auto result{node->body()->accept(*this)};
52 0 : if (!result) {
53 0 : return createError(result.error());
54 0 : }
55 0 : return {};
56 0 : }
57 :
58 : std::expected<std::shared_ptr<llvm::Value>, Error>
59 0 : CodeGeneration::visit(const AST_DO_WHILE *node) const noexcept {
60 0 : if (!node) {
61 0 : return createError(ERROR_TYPE::NULL_NODE, "invalid AST_DO_WHILE");
62 0 : }
63 0 : const auto result{node->body()->accept(*this)};
64 0 : if (!result) {
65 0 : return createError(result.error());
66 0 : }
67 0 : const auto condition{node->condition()->accept(*this)};
68 0 : if (!condition) {
69 0 : return createError(condition.error());
70 0 : }
71 0 : return {};
72 0 : }
73 :
74 : std::expected<std::shared_ptr<llvm::Value>, Error>
75 0 : CodeGeneration::visit(const AST_PASS *node) const noexcept {
76 0 : if (!node) {
77 0 : return createError(ERROR_TYPE::NULL_NODE, "invalid AST_PASS");
78 0 : }
79 0 : return {};
80 0 : }
81 :
82 : std::expected<std::shared_ptr<llvm::Value>, Error>
83 0 : CodeGeneration::visit(const AST_STOP *node) const noexcept {
84 0 : if (!node) {
85 0 : return createError(ERROR_TYPE::NULL_NODE, "invalid AST_STOP");
86 0 : }
87 0 : return {};
88 0 : }
89 :
90 : }
|