aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MoonParser/moon_ast.cpp93
1 files changed, 51 insertions, 42 deletions
diff --git a/MoonParser/moon_ast.cpp b/MoonParser/moon_ast.cpp
index 4fb0212..a98e75e 100644
--- a/MoonParser/moon_ast.cpp
+++ b/MoonParser/moon_ast.cpp
@@ -160,7 +160,7 @@ public:
160 switch (node->getId()) { 160 switch (node->getId()) {
161 case "Block"_id: 161 case "Block"_id:
162 pushScope(); 162 pushScope();
163 transformBlock(node, out); 163 transformBody(node, out);
164 popScope(); 164 popScope();
165 break; 165 break;
166 default: break; 166 default: break;
@@ -301,26 +301,6 @@ private:
301 // out.push_back(trim(str) + nll(node)); 301 // out.push_back(trim(str) + nll(node));
302 } 302 }
303 303
304 void transformBlock(ast_node* block, std::vector<std::string>& out) {
305 std::vector<std::string> temp;
306 block->eachChild([&](ast_node* node) {
307 switch (node->getId()) {
308 case "Line"_id: transformLine(node, temp); break;
309 default: break;
310 }
311 });
312 out.push_back(join(temp));
313 }
314
315 void transformLine(ast_node* line, std::vector<std::string>& out) {
316 line->eachChild([&](ast_node* node) {
317 switch (node->getId()) {
318 case "Statement"_id: transformStatement(node, out); break;
319 default: break;
320 }
321 });
322 }
323
324 void transformStatement(ast_node* statement, std::vector<std::string>& out) { 304 void transformStatement(ast_node* statement, std::vector<std::string>& out) {
325 std::vector<std::string> temp; 305 std::vector<std::string> temp;
326 auto transformContent = [&](ast_node* node, std::vector<std::string>& out) { 306 auto transformContent = [&](ast_node* node, std::vector<std::string>& out) {
@@ -419,12 +399,51 @@ private:
419 break; 399 break;
420 } 400 }
421 case "Update"_id: transformUpdate(node, temp); break; 401 case "Update"_id: transformUpdate(node, temp); break;
422 case "Assign"_id: transformAssign(node, temp); break; 402 case "Assign"_id: {
403 auto child = node->getChild(0);
404 switch (child->getId()) {
405 case "With"_id: transformWith(child, temp); break;
406 case "If"_id:
407 transformIfClosure(child, temp);
408 break;
409 case "Switch"_id: transformSwitch(child, temp); break;
410 case "TableBlock"_id: transformTableBlock(child, temp); break;
411 case "ExpListLow"_id:
412 transformExpListLow(child, temp);
413 break;
414 default: break;
415 }
416 break;
417 }
423 default: break; 418 default: break;
424 } 419 }
425 }); 420 });
426 out.push_back(preDefined + indent() + temp[0] + s(" = "sv) + temp[1] + nll(assignment)); 421 out.push_back(preDefined + indent() + temp[0] + s(" = "sv) + temp[1] + nll(assignment));
427 } 422 }
423 void transformIfClosure(ast_node* ifNode, std::vector<std::string>& out) {
424 std::vector<std::string> temp;
425 temp.push_back(s("(function()"sv) + nll(ifNode));
426 pushScope();
427 ifNode->traverse([&](ast_node* node) {
428 switch (node->getId()) {
429 case "IfCond"_id: {
430 std::vector<std::string> tmp;
431 auto exp = node->getChild(0);
432 transformExp(exp, tmp);
433 _buf << indent() << "if "sv << tmp.front() << " then"sv << nll(exp);
434 temp.push_back(clearBuf());
435 return traversal::Return;
436 }
437 case "Body"_id:
438 transformBody(node, temp);
439 return traversal::Return;
440 default: return traversal::Continue;
441 }
442 });
443 popScope();
444 temp.push_back(indent() + s("end)()"sv));
445 out.push_back(join(temp));
446 }
428 447
429 void transformExpList(ast_node* expList, std::vector<std::string>& out) { 448 void transformExpList(ast_node* expList, std::vector<std::string>& out) {
430 std::vector<std::string> temp; 449 std::vector<std::string> temp;
@@ -448,19 +467,6 @@ private:
448 out.push_back(join(temp, ", "sv)); 467 out.push_back(join(temp, ", "sv));
449 } 468 }
450 469
451 void transformAssign(ast_node* assign, std::vector<std::string>& out) {
452 assign->eachChild([&](ast_node* node) {
453 switch (node->getId()) {
454 case "With"_id: transformWith(node, out); break;
455 case "If"_id: transformIf(node, out); break;
456 case "Switch"_id: transformSwitch(node, out); break;
457 case "TableBlock"_id: transformTableBlock(node, out); break;
458 case "ExpListLow"_id: transformExpListLow(node, out); break;
459 default: break;
460 }
461 });
462 }
463
464 void transformExp(ast_node* exp, std::vector<std::string>& out) { 470 void transformExp(ast_node* exp, std::vector<std::string>& out) {
465 std::vector<std::string> temp; 471 std::vector<std::string> temp;
466 exp->eachChild([&](ast_node* node) { 472 exp->eachChild([&](ast_node* node) {
@@ -603,13 +609,16 @@ private:
603 } 609 }
604 610
605 void transformBody(ast_node* body, std::vector<std::string>& out) { 611 void transformBody(ast_node* body, std::vector<std::string>& out) {
606 body->eachChild([&](ast_node* node) { 612 std::vector<std::string> temp;
613 body->traverse([&](ast_node* node) {
607 switch (node->getId()) { 614 switch (node->getId()) {
608 case "Block"_id: transformBlock(node, out); break; 615 case "Statement"_id:
609 case "Statement"_id: transformStatement(node, out); break; 616 transformStatement(node, temp);
610 default: break; 617 return traversal::Return;
618 default: return traversal::Continue;
611 } 619 }
612 }); 620 });
621 out.push_back(join(temp));
613 } 622 }
614 623
615 void transformFnArgsDef(ast_node* argsDef, std::vector<std::string>& out) { 624 void transformFnArgsDef(ast_node* argsDef, std::vector<std::string>& out) {
@@ -798,8 +807,8 @@ private:
798 default: break; 807 default: break;
799 } 808 }
800 }); 809 });
801 std::string args = join(temp, ", "); 810 std::string args = join(temp, ", "sv);
802 out.push_back(args.empty() ? "()" : s("(") + args + ")"); 811 out.push_back(args.empty() ? s("()"sv) : s("("sv) + args + s(")"sv));
803 } 812 }
804 813
805 void transformColonChain(ast_node* colonChain, std::vector<std::string>& out) { 814 void transformColonChain(ast_node* colonChain, std::vector<std::string>& out) {
@@ -833,8 +842,8 @@ private:
833 void transformImport(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} 842 void transformImport(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);}
834 void transformWhile(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} 843 void transformWhile(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);}
835 void transformWith(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} 844 void transformWith(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);}
836 void transformIf(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);}
837 void transformFor(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} 845 void transformFor(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);}
846 void transformIf(ast_node* node, std::vector<std::string>& out) { noopnl(node, out); }
838 void transformForEach(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} 847 void transformForEach(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);}
839 void transformSwitch(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} 848 void transformSwitch(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);}
840 void transformReturn(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} 849 void transformReturn(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);}