aboutsummaryrefslogtreecommitdiff
path: root/MoonParser/moon_ast.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'MoonParser/moon_ast.cpp')
-rw-r--r--MoonParser/moon_ast.cpp34
1 files changed, 15 insertions, 19 deletions
diff --git a/MoonParser/moon_ast.cpp b/MoonParser/moon_ast.cpp
index 3c433ae..fcbaa90 100644
--- a/MoonParser/moon_ast.cpp
+++ b/MoonParser/moon_ast.cpp
@@ -156,22 +156,10 @@ public:
156 if (root) { 156 if (root) {
157 std::cout << "compiled!\n\n"; 157 std::cout << "compiled!\n\n";
158 std::vector<std::string> out; 158 std::vector<std::string> out;
159 root->eachChild([&](ast_node* node) { 159 pushScope();
160 switch (node->getId()) { 160 transformBlock(root->block, out);
161 case "Block"_id: 161 popScope();
162 pushScope(); 162 std::string result = std::move(out.back());
163 transformBody(static_cast<Body_t*>(node), out, true);
164 popScope();
165 break;
166 default: break;
167 }
168 });
169 std::string result;
170 if (out.size() == 1) {
171 result = std::move(out.front());
172 } else if (out.size() > 1) {
173 result = join(out, "\n"sv);
174 }
175 std::cout << result << '\n'; 163 std::cout << result << '\n';
176 } else { 164 } else {
177 std::cout << "compile failed!\n"; 165 std::cout << "compile failed!\n";
@@ -807,9 +795,9 @@ private:
807 out.push_back(clearBuf()); 795 out.push_back(clearBuf());
808 } 796 }
809 797
810 void transformBody(Body_t* body, std::vector<std::string>& out, bool implicitReturn = false) { 798 void transformCodes(ast_node* nodes, std::vector<std::string>& out, bool implicitReturn) {
811 if (implicitReturn) { 799 if (implicitReturn) {
812 auto last = lastStatementFrom(body); 800 auto last = lastStatementFrom(nodes);
813 if (ast_is<ExpList_t>(last->content)) { 801 if (ast_is<ExpList_t>(last->content)) {
814 auto expList = static_cast<ExpList_t*>(last->content.get()); 802 auto expList = static_cast<ExpList_t*>(last->content.get());
815 auto expListLow = new_ptr<ExpListLow_t>(); 803 auto expListLow = new_ptr<ExpListLow_t>();
@@ -821,7 +809,7 @@ private:
821 } 809 }
822 } 810 }
823 std::vector<std::string> temp; 811 std::vector<std::string> temp;
824 body->traverse([&](ast_node* node) { 812 nodes->traverse([&](ast_node* node) {
825 switch (node->getId()) { 813 switch (node->getId()) {
826 case "Statement"_id: 814 case "Statement"_id:
827 transformStatement(static_cast<Statement_t*>(node), temp); 815 transformStatement(static_cast<Statement_t*>(node), temp);
@@ -832,6 +820,14 @@ private:
832 out.push_back(join(temp)); 820 out.push_back(join(temp));
833 } 821 }
834 822
823 void transformBody(Body_t* body, std::vector<std::string>& out, bool implicitReturn = false) {
824 transformCodes(body, out, implicitReturn);
825 }
826
827 void transformBlock(Block_t* block, std::vector<std::string>& out, bool implicitReturn = true) {
828 transformCodes(block, out, implicitReturn);
829 }
830
835 void transformReturn(Return_t* returnNode, std::vector<std::string>& out) { 831 void transformReturn(Return_t* returnNode, std::vector<std::string>& out) {
836 if (auto valueList = returnNode->valueList.get()) { 832 if (auto valueList = returnNode->valueList.get()) {
837 if (auto singleValue = singleValueFrom(valueList)) { 833 if (auto singleValue = singleValueFrom(valueList)) {