diff options
| author | Li Jin <dragon-fly@qq.com> | 2019-09-17 13:51:28 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2019-09-17 13:51:28 +0800 |
| commit | ad0b9c911095b402159f51abe4d98a56d2335973 (patch) | |
| tree | 4cea91332b5339d077f240e4c3c300f4874375e0 | |
| parent | 74c4f6eab47f76b093e17f515204525e00a3b352 (diff) | |
| download | yuescript-ad0b9c911095b402159f51abe4d98a56d2335973.tar.gz yuescript-ad0b9c911095b402159f51abe4d98a56d2335973.tar.bz2 yuescript-ad0b9c911095b402159f51abe4d98a56d2335973.zip | |
clean up some dirty codes.
| -rw-r--r-- | MoonParser/ast.hpp | 60 | ||||
| -rw-r--r-- | MoonParser/moon_ast.cpp | 397 | ||||
| -rw-r--r-- | MoonParser/moon_ast.h | 126 | ||||
| -rw-r--r-- | MoonParser/moon_parser.cpp | 28 |
4 files changed, 237 insertions, 374 deletions
diff --git a/MoonParser/ast.hpp b/MoonParser/ast.hpp index e7ae74f..1077f5d 100644 --- a/MoonParser/ast.hpp +++ b/MoonParser/ast.hpp | |||
| @@ -25,8 +25,7 @@ typedef std::vector<ast_node*> ast_stack; | |||
| 25 | extern int ast_type_id; | 25 | extern int ast_type_id; |
| 26 | 26 | ||
| 27 | template<class T> | 27 | template<class T> |
| 28 | int ast_type() | 28 | int ast_type() { |
| 29 | { | ||
| 30 | static int type = ast_type_id++; | 29 | static int type = ast_type_id++; |
| 31 | return type; | 30 | return type; |
| 32 | } | 31 | } |
| @@ -211,7 +210,7 @@ public: | |||
| 211 | 210 | ||
| 212 | template <class T> | 211 | template <class T> |
| 213 | T* to() const { | 212 | T* to() const { |
| 214 | assert(m_ptr->getId() == ast_type<T>()); | 213 | assert(m_ptr->getId() != ast_type<T>()); |
| 215 | return static_cast<T*>(m_ptr); | 214 | return static_cast<T*>(m_ptr); |
| 216 | } | 215 | } |
| 217 | 216 | ||
| @@ -313,13 +312,13 @@ inline ast_ptr<T, false, false> new_ptr() { | |||
| 313 | return ast_ptr<T, false, false>(new T); | 312 | return ast_ptr<T, false, false>(new T); |
| 314 | } | 313 | } |
| 315 | 314 | ||
| 316 | template <class ...Args> class ast_choice : public _ast_ptr { | 315 | template <class ...Args> class ast_sel : public _ast_ptr { |
| 317 | public: | 316 | public: |
| 318 | ast_choice() : _ast_ptr(nullptr, true) {} | 317 | ast_sel() : _ast_ptr(nullptr, true) {} |
| 319 | 318 | ||
| 320 | ast_choice(const ast_choice<Args...>& other) : _ast_ptr(other.get(), true) {} | 319 | ast_sel(const ast_sel<Args...>& other) : _ast_ptr(other.get(), true) {} |
| 321 | 320 | ||
| 322 | ast_choice<Args...>& operator=(const ast_choice<Args...>& other) { | 321 | ast_sel<Args...>& operator=(const ast_sel<Args...>& other) { |
| 323 | set(other.get()); | 322 | set(other.get()); |
| 324 | return *this; | 323 | return *this; |
| 325 | } | 324 | } |
| @@ -340,7 +339,7 @@ public: | |||
| 340 | 339 | ||
| 341 | ast_node* node = st.back(); | 340 | ast_node* node = st.back(); |
| 342 | 341 | ||
| 343 | if (!ast_choice::accept(node)) throw std::logic_error("invalid AST node"); | 342 | if (!ast_sel::accept(node)) throw std::logic_error("invalid AST node"); |
| 344 | 343 | ||
| 345 | st.pop_back(); | 344 | st.pop_back(); |
| 346 | 345 | ||
| @@ -351,7 +350,7 @@ private: | |||
| 351 | virtual bool accept(ast_node* node) override { | 350 | virtual bool accept(ast_node* node) override { |
| 352 | if (!node) return false; | 351 | if (!node) return false; |
| 353 | using swallow = bool[]; | 352 | using swallow = bool[]; |
| 354 | bool* result = nullptr; | 353 | bool result = false; |
| 355 | (void)swallow{result || (result = ast_type<Args>() == node->get_type())...}; | 354 | (void)swallow{result || (result = ast_type<Args>() == node->get_type())...}; |
| 356 | return result; | 355 | return result; |
| 357 | } | 356 | } |
| @@ -449,6 +448,49 @@ private: | |||
| 449 | } | 448 | } |
| 450 | }; | 449 | }; |
| 451 | 450 | ||
| 451 | template <class ...Args> class ast_sel_list : public _ast_list { | ||
| 452 | public: | ||
| 453 | ///the default constructor. | ||
| 454 | ast_sel_list() {} | ||
| 455 | |||
| 456 | ast_sel_list(const ast_sel_list<Args...>& other) { | ||
| 457 | clear(); | ||
| 458 | dup(other); | ||
| 459 | } | ||
| 460 | |||
| 461 | ast_sel_list<Args...>& operator=(const ast_sel_list<Args...>& other) { | ||
| 462 | clear(); | ||
| 463 | dup(other); | ||
| 464 | return *this; | ||
| 465 | } | ||
| 466 | |||
| 467 | /** Pops objects of type T from the stack until no more objects can be popped. | ||
| 468 | @param st stack. | ||
| 469 | */ | ||
| 470 | virtual void construct(ast_stack &st) override { | ||
| 471 | while (!st.empty()) { | ||
| 472 | ast_node* node = st.back(); | ||
| 473 | |||
| 474 | //if the object was not not of the appropriate type, | ||
| 475 | //end the list parsing | ||
| 476 | if (!ast_sel_list<Args...>::accept(node)) return; | ||
| 477 | |||
| 478 | st.pop_back(); | ||
| 479 | |||
| 480 | //insert the object in the list, in reverse order | ||
| 481 | m_objects.push_front(node); | ||
| 482 | node->retain(); | ||
| 483 | } | ||
| 484 | } | ||
| 485 | private: | ||
| 486 | virtual bool accept(ast_node* node) override { | ||
| 487 | if (!node) return false; | ||
| 488 | using swallow = bool[]; | ||
| 489 | bool result = false; | ||
| 490 | (void)swallow{result || (result = ast_type<Args>() == node->get_type())...}; | ||
| 491 | return result; | ||
| 492 | } | ||
| 493 | }; | ||
| 452 | 494 | ||
| 453 | /** AST function which creates an object of type T | 495 | /** AST function which creates an object of type T |
| 454 | and pushes it to the node stack. | 496 | and pushes it to the node stack. |
diff --git a/MoonParser/moon_ast.cpp b/MoonParser/moon_ast.cpp index af34395..f7dcae6 100644 --- a/MoonParser/moon_ast.cpp +++ b/MoonParser/moon_ast.cpp | |||
| @@ -82,20 +82,11 @@ AST_IMPL(double_string_content) | |||
| 82 | AST_IMPL(DoubleString) | 82 | AST_IMPL(DoubleString) |
| 83 | AST_IMPL(String) | 83 | AST_IMPL(String) |
| 84 | AST_IMPL(Parens) | 84 | AST_IMPL(Parens) |
| 85 | AST_IMPL(FnArgs) | ||
| 86 | AST_IMPL(chain_call) | ||
| 87 | AST_IMPL(chain_item) | ||
| 88 | AST_IMPL(DotChainItem) | 85 | AST_IMPL(DotChainItem) |
| 89 | AST_IMPL(ColonChainItem) | 86 | AST_IMPL(ColonChainItem) |
| 90 | AST_IMPL(chain_dot_chain) | ||
| 91 | AST_IMPL(ChainItem) | ||
| 92 | AST_IMPL(ChainItems) | ||
| 93 | AST_IMPL(invoke_chain) | ||
| 94 | AST_IMPL(ColonChain) | ||
| 95 | AST_IMPL(default_value) | 87 | AST_IMPL(default_value) |
| 96 | AST_IMPL(Slice) | 88 | AST_IMPL(Slice) |
| 97 | AST_IMPL(Invoke) | 89 | AST_IMPL(Invoke) |
| 98 | AST_IMPL(TableValue) | ||
| 99 | AST_IMPL(TableLit) | 90 | AST_IMPL(TableLit) |
| 100 | AST_IMPL(TableBlock) | 91 | AST_IMPL(TableBlock) |
| 101 | AST_IMPL(class_member_list) | 92 | AST_IMPL(class_member_list) |
| @@ -107,7 +98,6 @@ AST_IMPL(export_op) | |||
| 107 | AST_IMPL(Export) | 98 | AST_IMPL(Export) |
| 108 | AST_IMPL(variable_pair) | 99 | AST_IMPL(variable_pair) |
| 109 | AST_IMPL(normal_pair) | 100 | AST_IMPL(normal_pair) |
| 110 | AST_IMPL(KeyValue) | ||
| 111 | AST_IMPL(FnArgDef) | 101 | AST_IMPL(FnArgDef) |
| 112 | AST_IMPL(FnArgDefList) | 102 | AST_IMPL(FnArgDefList) |
| 113 | AST_IMPL(outer_var_shadow) | 103 | AST_IMPL(outer_var_shadow) |
| @@ -116,8 +106,6 @@ AST_IMPL(fn_arrow) | |||
| 116 | AST_IMPL(FunLit) | 106 | AST_IMPL(FunLit) |
| 117 | AST_IMPL(NameOrDestructure) | 107 | AST_IMPL(NameOrDestructure) |
| 118 | AST_IMPL(AssignableNameList) | 108 | AST_IMPL(AssignableNameList) |
| 119 | AST_IMPL(ArgBlock) | ||
| 120 | AST_IMPL(invoke_args_with_table) | ||
| 121 | AST_IMPL(InvokeArgs) | 109 | AST_IMPL(InvokeArgs) |
| 122 | AST_IMPL(const_value) | 110 | AST_IMPL(const_value) |
| 123 | AST_IMPL(unary_exp) | 111 | AST_IMPL(unary_exp) |
| @@ -354,7 +342,7 @@ private: | |||
| 354 | case "DotChainItem"_id: | 342 | case "DotChainItem"_id: |
| 355 | case "ColonChainItem"_id: | 343 | case "ColonChainItem"_id: |
| 356 | case "Slice"_id: | 344 | case "Slice"_id: |
| 357 | case "Index"_id: | 345 | case "Exp"_id: |
| 358 | case "Callable"_id: | 346 | case "Callable"_id: |
| 359 | case "String"_id: | 347 | case "String"_id: |
| 360 | return traversal::Stop; | 348 | return traversal::Stop; |
| @@ -373,7 +361,7 @@ private: | |||
| 373 | case "DotChainItem"_id: | 361 | case "DotChainItem"_id: |
| 374 | case "ColonChainItem"_id: | 362 | case "ColonChainItem"_id: |
| 375 | case "Slice"_id: | 363 | case "Slice"_id: |
| 376 | case "Index"_id: | 364 | case "Exp"_id: |
| 377 | case "Callable"_id: | 365 | case "Callable"_id: |
| 378 | case "String"_id: | 366 | case "String"_id: |
| 379 | last = node; | 367 | last = node; |
| @@ -389,24 +377,22 @@ private: | |||
| 389 | } | 377 | } |
| 390 | } | 378 | } |
| 391 | 379 | ||
| 392 | std::vector<ast_node*> getChainList(ast_node* chain) { | 380 | std::vector<ast_node*> getChainList(ChainValue_t* chainValue) { |
| 393 | std::vector<ast_node*> list; | 381 | std::vector<ast_node*> temp; |
| 394 | chain->traverse([&](ast_node* node) { | 382 | switch (chainValue->caller->getId()) { |
| 395 | switch (node->getId()) { | 383 | case "Callable"_id: |
| 396 | case "Invoke"_id: | 384 | temp.push_back(chainValue->caller); |
| 397 | case "DotChainItem"_id: | 385 | break; |
| 398 | case "ColonChainItem"_id: | 386 | case "Chain"_id: |
| 399 | case "Slice"_id: | 387 | const auto& items = chainValue->caller.to<Chain_t>()->items.objects(); |
| 400 | case "Index"_id: | 388 | temp.resize(items.size()); |
| 401 | case "Callable"_id: | 389 | std::copy(items.begin(), items.end(), temp.begin()); |
| 402 | case "String"_id: | 390 | break; |
| 403 | list.push_back(node); | 391 | } |
| 404 | return traversal::Return; | 392 | if (chainValue->arguments) { |
| 405 | default: | 393 | temp.push_back(chainValue->arguments); |
| 406 | return traversal::Continue; | 394 | } |
| 407 | } | 395 | return temp; |
| 408 | }); | ||
| 409 | return list; | ||
| 410 | } | 396 | } |
| 411 | 397 | ||
| 412 | void transformStatement(Statement_t* statement, std::vector<std::string>& out) { | 398 | void transformStatement(Statement_t* statement, std::vector<std::string>& out) { |
| @@ -1055,99 +1041,64 @@ private: | |||
| 1055 | } | 1041 | } |
| 1056 | } | 1042 | } |
| 1057 | 1043 | ||
| 1058 | void transformChain(Chain_t* chain, std::vector<std::string>& out) { | 1044 | void transformChain(Chain_t* chain, std::vector<std::string>& out, bool argsFollowed = false) { |
| 1059 | auto item = chain->item.get(); | ||
| 1060 | switch (item->getId()) { | ||
| 1061 | case "chain_call"_id: transform_chain_call(static_cast<chain_call_t*>(item), out); break; | ||
| 1062 | case "chain_item"_id: transformChainItems(static_cast<chain_item_t*>(item)->chain, out); break; | ||
| 1063 | case "chain_dot_chain"_id: transform_chain_dot_chain(item, out); break; | ||
| 1064 | case "ColonChain"_id: transformColonChain(static_cast<ColonChain_t*>(item), out); break; | ||
| 1065 | default: break; | ||
| 1066 | } | ||
| 1067 | } | ||
| 1068 | |||
| 1069 | void transform_chain_call(chain_call_t* chain_call, std::vector<std::string>& out) { | ||
| 1070 | std::vector<std::string> temp; | 1045 | std::vector<std::string> temp; |
| 1071 | auto caller = chain_call->caller.get(); | 1046 | const auto& chainList = chain->items.objects(); |
| 1072 | switch (caller->getId()) { | 1047 | if (!argsFollowed && chainList.size() == 2 && chainList.back()->getId() == "ColonChainItem"_id) { |
| 1073 | case "Callable"_id: { | ||
| 1074 | transformCallable(static_cast<Callable_t*>(caller), temp, startWithInvoke(chain_call->chain)); | ||
| 1075 | break; | ||
| 1076 | } | ||
| 1077 | case "String"_id: transformString(static_cast<String_t*>(caller), temp); break; | ||
| 1078 | default: break; | ||
| 1079 | } | ||
| 1080 | transformChainItems(chain_call->chain, temp); | ||
| 1081 | out.push_back(join(temp)); | ||
| 1082 | } | ||
| 1083 | 1048 | ||
| 1084 | void transformChainItems(ChainItems_t* chainItems, std::vector<std::string>& out) { | ||
| 1085 | std::vector<std::string> temp; | ||
| 1086 | for (auto _chainItem : chainItems->simpleChain.objects()) { | ||
| 1087 | auto chainItem = static_cast<ChainItem_t*>(_chainItem); | ||
| 1088 | transformChainItem(chainItem, temp); | ||
| 1089 | } | 1049 | } |
| 1090 | if (chainItems->colonChain) { | 1050 | for (auto it = chainList.begin(); it != chainList.end(); ++it) { |
| 1091 | transformColonChain(chainItems->colonChain, temp); | 1051 | auto item = *it; |
| 1052 | switch (item->getId()) { | ||
| 1053 | case "Invoke"_id: transformInvoke(static_cast<Invoke_t*>(item), temp); break; | ||
| 1054 | case "DotChainItem"_id: transformDotChainItem(static_cast<DotChainItem_t*>(item), temp); break; | ||
| 1055 | case "ColonChainItem"_id: transformColonChainItem(static_cast<ColonChainItem_t*>(item), temp); break; | ||
| 1056 | case "Slice"_id: transformSlice(static_cast<Slice_t*>(item), temp); break; | ||
| 1057 | case "Callable"_id: { | ||
| 1058 | auto next = it; ++next; | ||
| 1059 | auto followItem = next != chainList.end() ? *next : nullptr; | ||
| 1060 | transformCallable(static_cast<Callable_t*>(item), temp, | ||
| 1061 | followItem && followItem->getId() == "Invoke"_id); | ||
| 1062 | break; | ||
| 1063 | } | ||
| 1064 | case "String"_id: | ||
| 1065 | transformString(static_cast<String_t*>(item), temp); | ||
| 1066 | temp.back() = s("("sv) + temp.back() + s(")"sv); | ||
| 1067 | break; | ||
| 1068 | case "Exp"_id: | ||
| 1069 | transformExp(static_cast<Exp_t*>(item), temp); | ||
| 1070 | temp.back() = s("["sv) + temp.back() + s("]"sv); | ||
| 1071 | break; | ||
| 1072 | default: break; | ||
| 1073 | } | ||
| 1092 | } | 1074 | } |
| 1093 | out.push_back(join(temp)); | 1075 | out.push_back(join(temp)); |
| 1094 | } | 1076 | } |
| 1095 | 1077 | ||
| 1096 | void transformChainItem(ChainItem_t* chainItem, std::vector<std::string>& out) { | 1078 | void transformDotChainItem(DotChainItem_t* dotChainItem, std::vector<std::string>& out) { |
| 1097 | auto item = chainItem->item.get(); | 1079 | out.push_back(s("."sv) + toString(dotChainItem->name)); |
| 1098 | switch (item->getId()) { | ||
| 1099 | case "Invoke"_id: transformInvoke(static_cast<Invoke_t*>(item), out); break; | ||
| 1100 | case "DotChainItem"_id: | ||
| 1101 | out.push_back(s("."sv) + toString(item->getFirstChild())); | ||
| 1102 | break; | ||
| 1103 | case "Slice"_id: transformSlice(item, out); break; | ||
| 1104 | case "Exp"_id: | ||
| 1105 | transformExp(static_cast<Exp_t*>(item), out); | ||
| 1106 | out.back() = s("["sv) + out.back() + s("]"sv); | ||
| 1107 | break; | ||
| 1108 | default: break; | ||
| 1109 | } | ||
| 1110 | } | 1080 | } |
| 1111 | 1081 | ||
| 1112 | void transformInvoke(Invoke_t* invoke, std::vector<std::string>& out) { | 1082 | void transformColonChainItem(ColonChainItem_t* colonChainItem, std::vector<std::string>& out) { |
| 1113 | auto argument = invoke->argument.get(); | 1083 | out.push_back(s(colonChainItem->switchToDot ? "."sv : ":"sv) + toString(colonChainItem->name)); |
| 1114 | switch (argument->getId()) { | ||
| 1115 | case "FnArgs"_id: transformFnArgs(static_cast<FnArgs_t*>(argument), out); break; | ||
| 1116 | case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(argument), out); break; | ||
| 1117 | case "DoubleString"_id: transformDoubleString(static_cast<DoubleString_t*>(argument), out); break; | ||
| 1118 | case "LuaString"_id: transformLuaString(static_cast<LuaString_t*>(argument), out); break; | ||
| 1119 | default: break; | ||
| 1120 | } | ||
| 1121 | out.back() = s("("sv) + out.back() + s(")"sv); | ||
| 1122 | } | 1084 | } |
| 1123 | 1085 | ||
| 1124 | void transformFnArgs(FnArgs_t* fnArgs, std::vector<std::string>& out) { | 1086 | void transformSlice(Slice_t* slice, std::vector<std::string>& out) { |
| 1125 | std::vector<std::string> temp; | 1087 | noop(slice, out); |
| 1126 | for (auto node : fnArgs->args.objects()) { | ||
| 1127 | transformExp(static_cast<Exp_t*>(node), temp); | ||
| 1128 | } | ||
| 1129 | std::string args = join(temp, ", "sv); | ||
| 1130 | out.push_back(args); | ||
| 1131 | } | 1088 | } |
| 1132 | 1089 | ||
| 1133 | void transformColonChain(ColonChain_t* colonChain, std::vector<std::string>& out) { | 1090 | void transformInvoke(Invoke_t* invoke, std::vector<std::string>& out) { |
| 1134 | std::vector<std::string> temp; | ||
| 1135 | temp.push_back( | ||
| 1136 | s(colonChain->colonChain->switchToDot ? "."sv : ":"sv) + | ||
| 1137 | toString(colonChain->colonChain->name)); | ||
| 1138 | if (colonChain->invokeChain) { | ||
| 1139 | transform_invoke_chain(colonChain->invokeChain, temp); | ||
| 1140 | } | ||
| 1141 | out.push_back(join(temp)); | ||
| 1142 | } | ||
| 1143 | |||
| 1144 | void transform_invoke_chain(invoke_chain_t* invoke_chain, std::vector<std::string>& out) { | ||
| 1145 | std::vector<std::string> temp; | 1091 | std::vector<std::string> temp; |
| 1146 | transformInvoke(invoke_chain->invoke, temp); | 1092 | for (auto arg : invoke->args.objects()) { |
| 1147 | if (invoke_chain->chain) { | 1093 | switch (arg->getId()) { |
| 1148 | transformChainItems(invoke_chain->chain, temp); | 1094 | case "Exp"_id: transformExp(static_cast<Exp_t*>(arg), temp); break; |
| 1095 | case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(arg), temp); break; | ||
| 1096 | case "DoubleString"_id: transformDoubleString(static_cast<DoubleString_t*>(arg), temp); break; | ||
| 1097 | case "LuaString"_id: transformLuaString(static_cast<LuaString_t*>(arg), temp); break; | ||
| 1098 | default: break; | ||
| 1099 | } | ||
| 1149 | } | 1100 | } |
| 1150 | out.push_back(join(temp)); | 1101 | out.push_back(s("("sv) + join(temp, ", "sv) + s(")"sv)); |
| 1151 | } | 1102 | } |
| 1152 | 1103 | ||
| 1153 | void transform_unary_exp(unary_exp_t* unary_exp, std::vector<std::string>& out) { | 1104 | void transform_unary_exp(unary_exp_t* unary_exp, std::vector<std::string>& out) { |
| @@ -1168,22 +1119,21 @@ private: | |||
| 1168 | void transformTableLit(TableLit_t* tableLit, std::vector<std::string>& out) { | 1119 | void transformTableLit(TableLit_t* tableLit, std::vector<std::string>& out) { |
| 1169 | std::vector<std::string> temp; | 1120 | std::vector<std::string> temp; |
| 1170 | ast_node* lastNode = nullptr; | 1121 | ast_node* lastNode = nullptr; |
| 1171 | for (auto _tableValue : tableLit->values.objects()) { | 1122 | for (auto value : tableLit->values.objects()) { |
| 1172 | auto tableValue = static_cast<TableValue_t*>(_tableValue); | ||
| 1173 | auto value = tableValue->value.get(); | ||
| 1174 | switch (value->getId()) { | 1123 | switch (value->getId()) { |
| 1175 | case "KeyValue"_id: | 1124 | case "variable_pair"_id: |
| 1125 | transform_variable_pair(static_cast<variable_pair_t*>(value), temp); | ||
| 1126 | break; | ||
| 1127 | case "normal_pair"_id: | ||
| 1128 | transform_normal_pair(static_cast<normal_pair_t*>(value), temp); | ||
| 1129 | break; | ||
| 1176 | case "Exp"_id: | 1130 | case "Exp"_id: |
| 1177 | if (value->getId() == "Exp"_id) { | 1131 | transformExp(static_cast<Exp_t*>(value), temp); |
| 1178 | transformExp(static_cast<Exp_t*>(value), temp); | ||
| 1179 | } else { | ||
| 1180 | transformKeyValue(static_cast<KeyValue_t*>(value), temp); | ||
| 1181 | } | ||
| 1182 | temp.back() = (lastNode ? s(","sv) + nll(lastNode) : Empty) + indent(1) + temp.back(); | ||
| 1183 | lastNode = value; | ||
| 1184 | break; | 1132 | break; |
| 1185 | default: break; | 1133 | default: break; |
| 1186 | } | 1134 | } |
| 1135 | temp.back() = (lastNode ? s(","sv) + nll(lastNode) : Empty) + indent(1) + temp.back(); | ||
| 1136 | lastNode = value; | ||
| 1187 | } | 1137 | } |
| 1188 | out.push_back(s("{"sv) + nll(tableLit) + join(temp) + nlr(tableLit) + indent() + s("}"sv)); | 1138 | out.push_back(s("{"sv) + nll(tableLit) + join(temp) + nlr(tableLit) + indent() + s("}"sv)); |
| 1189 | } | 1139 | } |
| @@ -1329,14 +1279,12 @@ private: | |||
| 1329 | 1279 | ||
| 1330 | void transformInvokeArgs(InvokeArgs_t* invokeArgs, std::vector<std::string>& out) { | 1280 | void transformInvokeArgs(InvokeArgs_t* invokeArgs, std::vector<std::string>& out) { |
| 1331 | std::vector<std::string> temp; | 1281 | std::vector<std::string> temp; |
| 1332 | if (invokeArgs->argsList) { | 1282 | for (auto arg : invokeArgs->args.objects()) { |
| 1333 | transformExpList(invokeArgs->argsList, temp); | 1283 | switch (arg->getId()) { |
| 1334 | } | 1284 | case "Exp"_id: transformExp(static_cast<Exp_t*>(arg), temp); break; |
| 1335 | if (invokeArgs->argsTableBlock) { | 1285 | case "TableBlock"_id: transformTableBlock(arg, temp); break; |
| 1336 | transform_invoke_args_with_table(invokeArgs->argsTableBlock, temp); | 1286 | default: break; |
| 1337 | } | 1287 | } |
| 1338 | if (invokeArgs->tableBlock) { | ||
| 1339 | transformTableBlock(invokeArgs->tableBlock, temp); | ||
| 1340 | } | 1288 | } |
| 1341 | out.push_back(join(temp, ", "sv)); | 1289 | out.push_back(join(temp, ", "sv)); |
| 1342 | } | 1290 | } |
| @@ -1529,37 +1477,35 @@ private: | |||
| 1529 | out.push_back(join(temp)); | 1477 | out.push_back(join(temp)); |
| 1530 | } | 1478 | } |
| 1531 | 1479 | ||
| 1532 | void transformKeyValue(KeyValue_t* keyValue, std::vector<std::string>& out) { | 1480 | void transform_variable_pair(variable_pair_t* pair, std::vector<std::string>& out) { |
| 1533 | auto item = keyValue->item.get(); | 1481 | out.push_back(toString(pair->name)); |
| 1534 | switch (item->getId()) { | 1482 | } |
| 1535 | case "variable_pair"_id: | 1483 | |
| 1536 | out.push_back(toString(static_cast<variable_pair_t*>(item)->name)); | 1484 | void transform_normal_pair(normal_pair_t* pair, std::vector<std::string>& out) { |
| 1485 | auto key = pair->key.get(); | ||
| 1486 | std::vector<std::string> temp; | ||
| 1487 | switch (key->getId()) { | ||
| 1488 | case "KeyName"_id: transformKeyName(static_cast<KeyName_t*>(key), temp); break; | ||
| 1489 | case "Exp"_id: | ||
| 1490 | transformExp(static_cast<Exp_t*>(key), temp); | ||
| 1491 | temp.back() = s("["sv) + temp.back() + s("]"sv); | ||
| 1537 | break; | 1492 | break; |
| 1538 | case "normal_pair"_id: { | 1493 | case "DoubleString"_id: |
| 1539 | auto pair = static_cast<normal_pair_t*>(item); | 1494 | transformDoubleString(static_cast<DoubleString_t*>(key), temp); |
| 1540 | auto key = pair->key.get(); | 1495 | temp.back() = s("["sv) + temp.back() + s("]"sv); |
| 1541 | std::vector<std::string> temp; | 1496 | break; |
| 1542 | switch (key->getId()) { | 1497 | case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(key), temp); |
| 1543 | case "KeyName"_id: transformKeyName(static_cast<KeyName_t*>(key), temp); break; | 1498 | temp.back() = s("["sv) + temp.back() + s("]"sv); |
| 1544 | case "Exp"_id: | ||
| 1545 | transformExp(static_cast<Exp_t*>(key), temp); | ||
| 1546 | temp.back() = s("["sv) + temp.back() + s("]"sv); | ||
| 1547 | break; | ||
| 1548 | case "DoubleString"_id: transformDoubleString(static_cast<DoubleString_t*>(key), temp); break; | ||
| 1549 | case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(key), temp); break; | ||
| 1550 | default: break; | ||
| 1551 | } | ||
| 1552 | auto value = pair->value.get(); | ||
| 1553 | switch (value->getId()) { | ||
| 1554 | case "Exp"_id: transformExp(static_cast<Exp_t*>(value), temp); break; | ||
| 1555 | case "TableBlock"_id: transformTableBlock(static_cast<TableBlock_t*>(value), temp); break; | ||
| 1556 | default: break; | ||
| 1557 | } | ||
| 1558 | out.push_back(temp[0] + s(" = "sv) + temp[1]); | ||
| 1559 | break; | 1499 | break; |
| 1560 | } | ||
| 1561 | default: break; | 1500 | default: break; |
| 1562 | } | 1501 | } |
| 1502 | auto value = pair->value.get(); | ||
| 1503 | switch (value->getId()) { | ||
| 1504 | case "Exp"_id: transformExp(static_cast<Exp_t*>(value), temp); break; | ||
| 1505 | case "TableBlock"_id: transformTableBlock(static_cast<TableBlock_t*>(value), temp); break; | ||
| 1506 | default: break; | ||
| 1507 | } | ||
| 1508 | out.push_back(temp[0] + s(" = "sv) + temp[1]); | ||
| 1563 | } | 1509 | } |
| 1564 | 1510 | ||
| 1565 | void transformKeyName(KeyName_t* keyName, std::vector<std::string>& out) { | 1511 | void transformKeyName(KeyName_t* keyName, std::vector<std::string>& out) { |
| @@ -1802,16 +1748,14 @@ private: | |||
| 1802 | 1748 | ||
| 1803 | void transform_class_member_list(class_member_list_t* class_member_list, std::list<ClassMember>& out, const std::string& classVar) { | 1749 | void transform_class_member_list(class_member_list_t* class_member_list, std::list<ClassMember>& out, const std::string& classVar) { |
| 1804 | std::vector<std::string> temp; | 1750 | std::vector<std::string> temp; |
| 1805 | for (auto _keyValue : class_member_list->values.objects()) { | 1751 | for (auto keyValue : class_member_list->values.objects()) { |
| 1806 | auto keyValue = static_cast<KeyValue_t*>(_keyValue); | ||
| 1807 | bool isBuiltin = false; | 1752 | bool isBuiltin = false; |
| 1808 | do { | 1753 | do { |
| 1809 | auto keyName = static_cast<KeyName_t*>( | 1754 | auto normal_pair = ast_cast<normal_pair_t>(keyValue); |
| 1810 | keyValue->getByPath({"normal_pair"_id, "KeyName"_id}) | 1755 | if (!normal_pair) break; |
| 1811 | ); | 1756 | auto keyName = normal_pair->key.as<KeyName_t>(); |
| 1812 | if (!keyName) break; | 1757 | if (!keyName) break; |
| 1813 | auto normal_pair = static_cast<normal_pair_t*>(keyValue->getFirstChild()); | 1758 | auto nameNode = keyName->name.as<Name_t>(); |
| 1814 | auto nameNode = keyName->getByPath({"Name"_id}); | ||
| 1815 | if (!nameNode) break; | 1759 | if (!nameNode) break; |
| 1816 | auto name = toString(nameNode); | 1760 | auto name = toString(nameNode); |
| 1817 | input newSuperCall; | 1761 | input newSuperCall; |
| @@ -1827,8 +1771,8 @@ private: | |||
| 1827 | if (auto chainValue = ast_cast<ChainValue_t>(node)) { | 1771 | if (auto chainValue = ast_cast<ChainValue_t>(node)) { |
| 1828 | if (auto var = chainValue->caller->getByPath({"Variable"_id})) { | 1772 | if (auto var = chainValue->caller->getByPath({"Variable"_id})) { |
| 1829 | if (toString(var) == "super"sv) { | 1773 | if (toString(var) == "super"sv) { |
| 1830 | if (chainValue->arguments && chainValue->arguments->argsList) { | 1774 | if (chainValue->arguments) { |
| 1831 | chainValue->arguments->argsList->exprs.push_front(toAst<Exp_t>("self"sv, Exp)); | 1775 | chainValue->arguments->args.push_front(toAst<Exp_t>("self"sv, Exp)); |
| 1832 | _codeCache.push_back(newSuperCall); | 1776 | _codeCache.push_back(newSuperCall); |
| 1833 | var->m_begin.m_it = _codeCache.back().begin(); | 1777 | var->m_begin.m_it = _codeCache.back().begin(); |
| 1834 | var->m_end.m_it = _codeCache.back().end(); | 1778 | var->m_end.m_it = _codeCache.back().end(); |
| @@ -1838,44 +1782,33 @@ private: | |||
| 1838 | var->m_end.m_it = _codeCache.back().end(); | 1782 | var->m_end.m_it = _codeCache.back().end(); |
| 1839 | } | 1783 | } |
| 1840 | } | 1784 | } |
| 1841 | } else if (auto var = chainValue->caller->getByPath({"chain_call"_id, "Callable"_id, "Variable"_id})) { | 1785 | } else if (auto var = chainValue->caller->getByPath({"Callable"_id, "Variable"_id})) { |
| 1842 | if (toString(var) == "super"sv) { | 1786 | if (toString(var) == "super"sv) { |
| 1843 | auto chainList = getChainList(chainValue->caller); | ||
| 1844 | if (auto args = chainValue->getByPath({"InvokeArgs"_id, "ExpList"_id})) { | ||
| 1845 | chainList.push_back(args); | ||
| 1846 | } | ||
| 1847 | auto insertSelfToArguments = [&](ast_node* item) { | 1787 | auto insertSelfToArguments = [&](ast_node* item) { |
| 1848 | switch (item->getId()) { | 1788 | switch (item->getId()) { |
| 1849 | case "ExpList"_id: | 1789 | case "InvokeArgs"_id: { |
| 1850 | static_cast<ExpList_t*>(item)->exprs.push_front(toAst<Exp_t>("self"sv, Exp)); | 1790 | auto invoke = static_cast<InvokeArgs_t*>(item); |
| 1851 | break; | 1791 | invoke->args.push_front(toAst<Exp_t>("self"sv, Exp)); |
| 1792 | return true; | ||
| 1793 | } | ||
| 1852 | case "Invoke"_id: { | 1794 | case "Invoke"_id: { |
| 1853 | auto invoke = static_cast<Invoke_t*>(item); | 1795 | auto invoke = static_cast<Invoke_t*>(item); |
| 1854 | if (auto fnArgs = invoke->argument.as<FnArgs_t>()) { | 1796 | invoke->args.push_front(toAst<Exp_t>("self"sv, Exp)); |
| 1855 | fnArgs->args.push_front(toAst<Exp_t>("self"sv, Exp)); | 1797 | return true; |
| 1856 | } else { | ||
| 1857 | auto string = new_ptr<String_t>(); | ||
| 1858 | string->str.set(invoke->argument); | ||
| 1859 | auto value = new_ptr<Value_t>(); | ||
| 1860 | value->item.set(string); | ||
| 1861 | auto exp = new_ptr<Exp_t>(); | ||
| 1862 | exp->value.set(value); | ||
| 1863 | auto newFnArgs = new_ptr<FnArgs_t>(); | ||
| 1864 | fnArgs->args.push_back(toAst<Exp_t>("self"sv, Exp)); | ||
| 1865 | newFnArgs->args.push_back(exp); | ||
| 1866 | invoke->argument.set(newFnArgs); | ||
| 1867 | } | ||
| 1868 | break; | ||
| 1869 | } | 1798 | } |
| 1870 | default: break; | 1799 | default: |
| 1800 | return false; | ||
| 1871 | } | 1801 | } |
| 1872 | }; | 1802 | }; |
| 1803 | auto chainList = getChainList(chainValue); | ||
| 1873 | if (chainList.size() == 2) { | 1804 | if (chainList.size() == 2) { |
| 1874 | _codeCache.push_back(newSuperCall); | 1805 | if (insertSelfToArguments(chainList.back())) { |
| 1806 | _codeCache.push_back(newSuperCall); | ||
| 1807 | } else { | ||
| 1808 | _codeCache.push_back(_converter.from_bytes(classVar) + L".__parent"); | ||
| 1809 | } | ||
| 1875 | var->m_begin.m_it = _codeCache.back().begin(); | 1810 | var->m_begin.m_it = _codeCache.back().begin(); |
| 1876 | var->m_end.m_it = _codeCache.back().end(); | 1811 | var->m_end.m_it = _codeCache.back().end(); |
| 1877 | auto item = chainList.back(); | ||
| 1878 | insertSelfToArguments(item); | ||
| 1879 | } else if (chainList.size() > 2) { | 1812 | } else if (chainList.size() > 2) { |
| 1880 | _codeCache.push_back(_converter.from_bytes(classVar) + L".__parent"); | 1813 | _codeCache.push_back(_converter.from_bytes(classVar) + L".__parent"); |
| 1881 | var->m_begin.m_it = _codeCache.back().begin(); | 1814 | var->m_begin.m_it = _codeCache.back().begin(); |
| @@ -1896,7 +1829,14 @@ private: | |||
| 1896 | return traversal::Continue; | 1829 | return traversal::Continue; |
| 1897 | }); | 1830 | }); |
| 1898 | } while (false); | 1831 | } while (false); |
| 1899 | transformKeyValue(keyValue, temp); | 1832 | switch (keyValue->getId()) { |
| 1833 | case "variable_pair"_id: | ||
| 1834 | transform_variable_pair(static_cast<variable_pair_t*>(keyValue), temp); | ||
| 1835 | break; | ||
| 1836 | case "normal_pair"_id: | ||
| 1837 | transform_normal_pair(static_cast<normal_pair_t*>(keyValue), temp); | ||
| 1838 | break; | ||
| 1839 | } | ||
| 1900 | out.push_back({temp.back(), isBuiltin, keyValue}); | 1840 | out.push_back({temp.back(), isBuiltin, keyValue}); |
| 1901 | temp.clear(); | 1841 | temp.clear(); |
| 1902 | } | 1842 | } |
| @@ -1926,7 +1866,6 @@ private: | |||
| 1926 | void transform_const_value(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | 1866 | void transform_const_value(ast_node* node, std::vector<std::string>& out) {noop(node, out);} |
| 1927 | void transformDo(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | 1867 | void transformDo(ast_node* node, std::vector<std::string>& out) {noop(node, out);} |
| 1928 | void transformTblComprehension(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | 1868 | void transformTblComprehension(ast_node* node, std::vector<std::string>& out) {noop(node, out);} |
| 1929 | void transform_chain_dot_chain(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
| 1930 | void transformSlice(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | 1869 | void transformSlice(ast_node* node, std::vector<std::string>& out) {noop(node, out);} |
| 1931 | void transformCompFor(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | 1870 | void transformCompFor(ast_node* node, std::vector<std::string>& out) {noop(node, out);} |
| 1932 | void transformCompClause(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | 1871 | void transformCompClause(ast_node* node, std::vector<std::string>& out) {noop(node, out);} |
| @@ -1938,64 +1877,18 @@ const std::string MoonCompliler::Empty; | |||
| 1938 | 1877 | ||
| 1939 | int main() | 1878 | int main() |
| 1940 | { | 1879 | { |
| 1941 | std::string s = R"TestCodesHere(class Hello | 1880 | std::string s = R"TestCodesHere(my_func 5,6,7, |
| 1942 | new: (@test, @world) => | 1881 | 6, another_func 6,7,8, |
| 1943 | print "creating object.." | 1882 | 9,1,2, |
| 1944 | hello: => | 1883 | 5,4, :name, :value)TestCodesHere"; |
| 1945 | print @test, @world | 1884 | /* |
| 1946 | __tostring: => "hello world" | 1885 | return my_func(5, 6, 7, 6, another_func(6, 7, 8, 9, 1, 2), 5, 4) |
| 1947 | 1886 | ||
| 1948 | x = Hello 1,2 | 1887 | with Hello! |
| 1949 | x\hello() | 1888 | x = \something! |
| 1950 | 1889 | print x | |
| 1951 | print x | 1890 | x! |
| 1952 | 1891 | */ | |
| 1953 | class Simple | ||
| 1954 | cool: => print "cool" | ||
| 1955 | |||
| 1956 | class Yikes extends Simple | ||
| 1957 | new: => print "created hello" | ||
| 1958 | |||
| 1959 | x = Yikes() | ||
| 1960 | x\cool() | ||
| 1961 | |||
| 1962 | |||
| 1963 | class Hi | ||
| 1964 | new: (arg) => | ||
| 1965 | print "init arg", arg | ||
| 1966 | |||
| 1967 | cool: (num) => | ||
| 1968 | print "num", num | ||
| 1969 | |||
| 1970 | |||
| 1971 | class Simple extends Hi | ||
| 1972 | new: => super "man" | ||
| 1973 | cool: => super 120302 | ||
| 1974 | |||
| 1975 | x = Simple() | ||
| 1976 | x\cool() | ||
| 1977 | |||
| 1978 | print x.__class == Simple | ||
| 1979 | |||
| 1980 | |||
| 1981 | class Okay | ||
| 1982 | -- what is going on | ||
| 1983 | something: 20323 | ||
| 1984 | -- yeaha | ||
| 1985 | |||
| 1986 | |||
| 1987 | class Biggie extends Okay | ||
| 1988 | something: => | ||
| 1989 | super 1,2,3,4 | ||
| 1990 | super.something another_self, 1,2,3,4 | ||
| 1991 | assert super == Okay | ||
| 1992 | |||
| 1993 | |||
| 1994 | class Yeah | ||
| 1995 | okay: => | ||
| 1996 | super\something 1,2,3,4 | ||
| 1997 | )TestCodesHere"; | ||
| 1998 | |||
| 1999 | MoonCompliler{}.complile(s); | 1892 | MoonCompliler{}.complile(s); |
| 2000 | 1893 | ||
| 2001 | return 0; | 1894 | return 0; |
diff --git a/MoonParser/moon_ast.h b/MoonParser/moon_ast.h index 9733bf9..c4f20c3 100644 --- a/MoonParser/moon_ast.h +++ b/MoonParser/moon_ast.h | |||
| @@ -290,11 +290,18 @@ AST_NODE(ChainValue, "ChainValue"_id) | |||
| 290 | ast_ptr<InvokeArgs_t, true> arguments; | 290 | ast_ptr<InvokeArgs_t, true> arguments; |
| 291 | AST_END(ChainValue) | 291 | AST_END(ChainValue) |
| 292 | 292 | ||
| 293 | class KeyValue_t; | 293 | AST_NODE(variable_pair, "variable_pair"_id) |
| 294 | ast_ptr<Variable_t> name; | ||
| 295 | AST_END(variable_pair) | ||
| 296 | |||
| 297 | AST_NODE(normal_pair, "normal_pair"_id) | ||
| 298 | ast_ptr<ast_node> key; // KeyName_t | [Exp_t] | DoubleString_t | SingleString_t | ||
| 299 | ast_ptr<ast_node> value; // Exp_t | TableBlock_t | ||
| 300 | AST_END(normal_pair) | ||
| 294 | 301 | ||
| 295 | AST_NODE(simple_table, "simple_table"_id) | 302 | AST_NODE(simple_table, "simple_table"_id) |
| 296 | ast_ptr<Seperator_t> sep; | 303 | ast_ptr<Seperator_t> sep; |
| 297 | ast_list<KeyValue_t> pairs; | 304 | ast_sel_list<variable_pair_t, normal_pair_t> pairs; |
| 298 | AST_END(simple_table) | 305 | AST_END(simple_table) |
| 299 | 306 | ||
| 300 | class String_t; | 307 | class String_t; |
| @@ -308,14 +315,6 @@ AST_NODE(SimpleValue, "SimpleValue"_id) | |||
| 308 | */ | 315 | */ |
| 309 | AST_END(SimpleValue) | 316 | AST_END(SimpleValue) |
| 310 | 317 | ||
| 311 | AST_NODE(Chain, "Chain"_id) | ||
| 312 | ast_ptr<ast_node> item; // chain_call_t | chain_item_t | chain_dot_chain_t | ColonChain_t | ||
| 313 | AST_END(Chain) | ||
| 314 | |||
| 315 | AST_NODE(Value, "Value"_id) | ||
| 316 | ast_ptr<ast_node> item; // SimpleValue_t | simple_table_t | ChainValue_t | String_t | ||
| 317 | AST_END(Value) | ||
| 318 | |||
| 319 | AST_LEAF(LuaString, "LuaString"_id) | 318 | AST_LEAF(LuaString, "LuaString"_id) |
| 320 | AST_END(LuaString) | 319 | AST_END(LuaString) |
| 321 | 320 | ||
| @@ -338,26 +337,6 @@ AST_NODE(String, "String"_id) | |||
| 338 | ast_ptr<ast_node> str; // DoubleString_t | SingleString_t | LuaString_t | 337 | ast_ptr<ast_node> str; // DoubleString_t | SingleString_t | LuaString_t |
| 339 | AST_END(String) | 338 | AST_END(String) |
| 340 | 339 | ||
| 341 | AST_NODE(Parens, "Parens"_id) | ||
| 342 | ast_ptr<Exp_t> expr; | ||
| 343 | AST_END(Parens) | ||
| 344 | |||
| 345 | AST_NODE(FnArgs, "FnArgs"_id) | ||
| 346 | ast_ptr<Seperator_t> sep; | ||
| 347 | ast_list<Exp_t> args; | ||
| 348 | AST_END(FnArgs) | ||
| 349 | |||
| 350 | class ChainItems_t; | ||
| 351 | |||
| 352 | AST_NODE(chain_call, "chain_call"_id) | ||
| 353 | ast_ptr<ast_node> caller; // Callable_t | String_t | ||
| 354 | ast_ptr<ChainItems_t> chain; | ||
| 355 | AST_END(chain_call) | ||
| 356 | |||
| 357 | AST_NODE(chain_item, "chain_item"_id) | ||
| 358 | ast_ptr<ChainItems_t> chain; | ||
| 359 | AST_END(chain_item) | ||
| 360 | |||
| 361 | AST_NODE(DotChainItem, "DotChainItem"_id) | 340 | AST_NODE(DotChainItem, "DotChainItem"_id) |
| 362 | ast_ptr<Name_t> name; | 341 | ast_ptr<Name_t> name; |
| 363 | AST_END(DotChainItem) | 342 | AST_END(DotChainItem) |
| @@ -367,67 +346,46 @@ AST_NODE(ColonChainItem, "ColonChainItem"_id) | |||
| 367 | bool switchToDot = false; | 346 | bool switchToDot = false; |
| 368 | AST_END(ColonChainItem) | 347 | AST_END(ColonChainItem) |
| 369 | 348 | ||
| 370 | AST_NODE(chain_dot_chain, "chain_dot_chain"_id) | ||
| 371 | ast_ptr<DotChainItem_t> caller; | ||
| 372 | ast_ptr<ChainItems_t, true> chain; | ||
| 373 | AST_END(chain_dot_chain) | ||
| 374 | |||
| 375 | class ColonChain_t; | ||
| 376 | class Invoke_t; | ||
| 377 | class Slice_t; | ||
| 378 | |||
| 379 | AST_NODE(ChainItem, "ChainItem"_id) | ||
| 380 | ast_ptr<ast_node> item; // Invoke_t | DotChainItem_t | Slice_t | [Exp_t] | ||
| 381 | AST_END(ChainItem) | ||
| 382 | |||
| 383 | AST_NODE(ChainItems, "ChainItems"_id) | ||
| 384 | ast_ptr<Seperator_t> sep; | ||
| 385 | ast_list<ChainItem_t> simpleChain; | ||
| 386 | ast_ptr<ColonChain_t, true> colonChain; | ||
| 387 | AST_END(ChainItems) | ||
| 388 | |||
| 389 | AST_NODE(invoke_chain, "invoke_chain"_id) | ||
| 390 | ast_ptr<Invoke_t> invoke; | ||
| 391 | ast_ptr<ChainItems_t, true> chain; | ||
| 392 | AST_END(invoke_chain) | ||
| 393 | |||
| 394 | AST_NODE(ColonChain, "ColonChain"_id) | ||
| 395 | ast_ptr<ColonChainItem_t> colonChain; | ||
| 396 | ast_ptr<invoke_chain_t, true> invokeChain; | ||
| 397 | AST_END(ColonChain) | ||
| 398 | |||
| 399 | AST_LEAF(default_value, "default_value"_id) | ||
| 400 | AST_END(default_value) | ||
| 401 | |||
| 402 | AST_NODE(Slice, "Slice"_id) | 349 | AST_NODE(Slice, "Slice"_id) |
| 403 | ast_ptr<ast_node> startValue; // Exp_t | default_value_t | 350 | ast_ptr<ast_node> startValue; // Exp_t | default_value_t |
| 404 | ast_ptr<ast_node> stopValue; // Exp_t | default_value_t | 351 | ast_ptr<ast_node> stopValue; // Exp_t | default_value_t |
| 405 | ast_ptr<ast_node> stepValue; // Exp_t | default_value_t | 352 | ast_ptr<ast_node> stepValue; // Exp_t | default_value_t |
| 406 | AST_END(Slice) | 353 | AST_END(Slice) |
| 407 | 354 | ||
| 355 | AST_NODE(Parens, "Parens"_id) | ||
| 356 | ast_ptr<Exp_t> expr; | ||
| 357 | AST_END(Parens) | ||
| 358 | |||
| 408 | AST_NODE(Invoke, "Invoke"_id) | 359 | AST_NODE(Invoke, "Invoke"_id) |
| 409 | ast_ptr<ast_node> argument; // FnArgs_t | SingleString_t | DoubleString_t | LuaString_t | 360 | ast_ptr<Seperator_t> sep; |
| 361 | ast_sel_list<Exp_t, SingleString_t, DoubleString_t, LuaString_t> args; | ||
| 410 | AST_END(Invoke) | 362 | AST_END(Invoke) |
| 411 | 363 | ||
| 412 | class KeyValue_t; | 364 | AST_NODE(Chain, "Chain"_id) |
| 365 | ast_ptr<Seperator_t> sep; | ||
| 366 | ast_sel_list<Callable_t, Invoke_t, DotChainItem_t, ColonChainItem_t, Slice_t, Exp_t> items; | ||
| 367 | AST_END(Chain) | ||
| 413 | 368 | ||
| 414 | AST_NODE(TableValue, "TableValue"_id) | 369 | AST_NODE(Value, "Value"_id) |
| 415 | ast_ptr<ast_node> value; // KeyValue_t | Exp_t | 370 | ast_ptr<ast_node> item; // SimpleValue_t | simple_table_t | ChainValue_t | String_t |
| 416 | AST_END(TableValue) | 371 | AST_END(Value) |
| 372 | |||
| 373 | AST_LEAF(default_value, "default_value"_id) | ||
| 374 | AST_END(default_value) | ||
| 417 | 375 | ||
| 418 | AST_NODE(TableLit, "TableLit"_id) | 376 | AST_NODE(TableLit, "TableLit"_id) |
| 419 | ast_ptr<Seperator_t> sep; | 377 | ast_ptr<Seperator_t> sep; |
| 420 | ast_list<TableValue_t> values; | 378 | ast_sel_list<variable_pair_t, normal_pair_t, Exp_t> values; |
| 421 | AST_END(TableLit) | 379 | AST_END(TableLit) |
| 422 | 380 | ||
| 423 | AST_NODE(TableBlock, "TableBlock"_id) | 381 | AST_NODE(TableBlock, "TableBlock"_id) |
| 424 | ast_ptr<Seperator_t> sep; | 382 | ast_ptr<Seperator_t> sep; |
| 425 | ast_list<KeyValue_t> values; | 383 | ast_sel_list<variable_pair_t, normal_pair_t> values; |
| 426 | AST_END(TableBlock) | 384 | AST_END(TableBlock) |
| 427 | 385 | ||
| 428 | AST_NODE(class_member_list, "class_member_list"_id) | 386 | AST_NODE(class_member_list, "class_member_list"_id) |
| 429 | ast_ptr<Seperator_t> sep; | 387 | ast_ptr<Seperator_t> sep; |
| 430 | ast_list<KeyValue_t> values; | 388 | ast_sel_list<variable_pair_t, normal_pair_t> values; |
| 431 | AST_END(class_member_list) | 389 | AST_END(class_member_list) |
| 432 | 390 | ||
| 433 | AST_NODE(ClassLine, "ClassLine"_id) | 391 | AST_NODE(ClassLine, "ClassLine"_id) |
| @@ -457,19 +415,6 @@ AST_NODE(Export, "Export"_id) | |||
| 457 | ast_ptr<ast_node> item; // ClassDecl_t | export_op_t | export_values_t | 415 | ast_ptr<ast_node> item; // ClassDecl_t | export_op_t | export_values_t |
| 458 | AST_END(Export) | 416 | AST_END(Export) |
| 459 | 417 | ||
| 460 | AST_NODE(variable_pair, "variable_pair"_id) | ||
| 461 | ast_ptr<Variable_t> name; | ||
| 462 | AST_END(variable_pair) | ||
| 463 | |||
| 464 | AST_NODE(normal_pair, "normal_pair"_id) | ||
| 465 | ast_ptr<ast_node> key; // KeyName_t | [Exp_t] | DoubleString_t | SingleString_t | ||
| 466 | ast_ptr<ast_node> value; // Exp_t | TableBlock_t | ||
| 467 | AST_END(normal_pair) | ||
| 468 | |||
| 469 | AST_NODE(KeyValue, "KeyValue"_id) | ||
| 470 | ast_ptr<ast_node> item; // variable_pair_t | normal_pair_t | ||
| 471 | AST_END(KeyValue) | ||
| 472 | |||
| 473 | AST_NODE(FnArgDef, "FnArgDef"_id) | 418 | AST_NODE(FnArgDef, "FnArgDef"_id) |
| 474 | ast_ptr<ast_node> name; // Variable_t | SelfName_t | 419 | ast_ptr<ast_node> name; // Variable_t | SelfName_t |
| 475 | ast_ptr<Exp_t, true> defaultValue; | 420 | ast_ptr<Exp_t, true> defaultValue; |
| @@ -508,20 +453,9 @@ AST_NODE(AssignableNameList, "AssignableNameList"_id) | |||
| 508 | ast_list<NameOrDestructure_t> items; | 453 | ast_list<NameOrDestructure_t> items; |
| 509 | AST_END(AssignableNameList) | 454 | AST_END(AssignableNameList) |
| 510 | 455 | ||
| 511 | AST_NODE(ArgBlock, "ArgBlock"_id) | ||
| 512 | ast_ptr<Seperator_t> sep; | ||
| 513 | ast_list<Exp_t> arguments; | ||
| 514 | AST_END(ArgBlock) | ||
| 515 | |||
| 516 | AST_NODE(invoke_args_with_table, "invoke_args_with_table"_id) | ||
| 517 | ast_ptr<ArgBlock_t, true> argBlock; | ||
| 518 | ast_ptr<TableBlock_t, true> tableBlock; | ||
| 519 | AST_END(invoke_args_with_table) | ||
| 520 | |||
| 521 | AST_NODE(InvokeArgs, "InvokeArgs"_id) | 456 | AST_NODE(InvokeArgs, "InvokeArgs"_id) |
| 522 | ast_ptr<ExpList_t, true> argsList; | 457 | ast_ptr<Seperator_t> sep; |
| 523 | ast_ptr<invoke_args_with_table_t, true> argsTableBlock; | 458 | ast_sel_list<Exp_t, TableBlock_t> args; |
| 524 | ast_ptr<TableBlock_t, true> tableBlock; | ||
| 525 | AST_END(InvokeArgs) | 459 | AST_END(InvokeArgs) |
| 526 | 460 | ||
| 527 | AST_LEAF(const_value, "const_value"_id) | 461 | AST_LEAF(const_value, "const_value"_id) |
diff --git a/MoonParser/moon_parser.cpp b/MoonParser/moon_parser.cpp index ec8df38..8917e58 100644 --- a/MoonParser/moon_parser.cpp +++ b/MoonParser/moon_parser.cpp | |||
| @@ -312,30 +312,24 @@ rule Parens = sym('(') >> *SpaceBreak >> Exp >> *SpaceBreak >> sym(')'); | |||
| 312 | rule Callable = Space >> Variable | SelfName | VarArg | Parens; | 312 | rule Callable = Space >> Variable | SelfName | VarArg | Parens; |
| 313 | rule FnArgsExpList = Exp >> *((Break | sym(',')) >> White >> Exp); | 313 | rule FnArgsExpList = Exp >> *((Break | sym(',')) >> White >> Exp); |
| 314 | 314 | ||
| 315 | rule FnArgs = Seperator >> | 315 | rule FnArgs = (symx('(') >> *SpaceBreak >> -FnArgsExpList >> *SpaceBreak >> sym(')')) | |
| 316 | ( | 316 | (sym('!') >> not_(expr('='))); |
| 317 | ( | ||
| 318 | symx('(') >> *SpaceBreak >> -FnArgsExpList >> *SpaceBreak >> sym(')') | ||
| 319 | ) | ( | ||
| 320 | sym('!') >> not_(expr('=')) | ||
| 321 | ) | ||
| 322 | ); | ||
| 323 | 317 | ||
| 324 | extern rule ChainItems, DotChainItem, ColonChain; | 318 | extern rule ChainItems, DotChainItem, ColonChain; |
| 325 | 319 | ||
| 326 | rule chain_call = (Callable | String) >> ChainItems; | 320 | rule chain_call = (Callable | String) >> ChainItems; |
| 327 | rule chain_item = not_(set(".\\")) >> ChainItems; | 321 | rule chain_item = and_(set(".\\")) >> ChainItems; |
| 328 | rule chain_dot_chain = DotChainItem >> -ChainItems; | 322 | rule chain_dot_chain = DotChainItem >> -ChainItems; |
| 329 | 323 | ||
| 330 | rule Chain = | 324 | rule Chain = Seperator >> ( |
| 331 | chain_call | | 325 | chain_call | |
| 332 | chain_item | | 326 | chain_item | |
| 333 | Space >> (chain_dot_chain | ColonChain); | 327 | Space >> (chain_dot_chain | ColonChain)); |
| 334 | 328 | ||
| 335 | extern rule ChainItem; | 329 | extern rule ChainItem; |
| 336 | 330 | ||
| 337 | rule chain_with_colon = +ChainItem >> -ColonChain; | 331 | rule chain_with_colon = +ChainItem >> -ColonChain; |
| 338 | rule ChainItems = Seperator >> (chain_with_colon | ColonChain); | 332 | rule ChainItems = chain_with_colon | ColonChain; |
| 339 | 333 | ||
| 340 | extern rule Invoke, Slice; | 334 | extern rule Invoke, Slice; |
| 341 | 335 | ||
| @@ -355,11 +349,11 @@ rule Slice = | |||
| 355 | (sym(',') >> Exp | default_value) >> | 349 | (sym(',') >> Exp | default_value) >> |
| 356 | sym(']'); | 350 | sym(']'); |
| 357 | 351 | ||
| 358 | rule Invoke = | 352 | rule Invoke = Seperator >> ( |
| 359 | FnArgs | | 353 | FnArgs | |
| 360 | SingleString | | 354 | SingleString | |
| 361 | DoubleString | | 355 | DoubleString | |
| 362 | and_(expr('[')) >> LuaString; | 356 | and_(expr('[')) >> LuaString); |
| 363 | 357 | ||
| 364 | extern rule TableValueList, TableLitLine; | 358 | extern rule TableValueList, TableLitLine; |
| 365 | 359 | ||
| @@ -448,7 +442,7 @@ rule ExpList = Seperator >> Exp >> *(sym(',') >> Exp); | |||
| 448 | rule ExpListLow = Seperator >> Exp >> *((sym(',') | sym(';')) >> Exp); | 442 | rule ExpListLow = Seperator >> Exp >> *((sym(',') | sym(';')) >> Exp); |
| 449 | 443 | ||
| 450 | rule ArgLine = CheckIndent >> Exp >> *(sym(',') >> Exp); | 444 | rule ArgLine = CheckIndent >> Exp >> *(sym(',') >> Exp); |
| 451 | rule ArgBlock = Seperator >> ArgLine >> *(sym(',') >> SpaceBreak >> ArgLine) >> PopIndent; | 445 | rule ArgBlock = ArgLine >> *(sym(',') >> SpaceBreak >> ArgLine) >> PopIndent; |
| 452 | 446 | ||
| 453 | rule invoke_args_with_table = | 447 | rule invoke_args_with_table = |
| 454 | sym(',') >> | 448 | sym(',') >> |
| @@ -458,9 +452,9 @@ rule invoke_args_with_table = | |||
| 458 | ); | 452 | ); |
| 459 | 453 | ||
| 460 | rule InvokeArgs = | 454 | rule InvokeArgs = |
| 461 | not_(expr('-')) >> | 455 | not_(expr('-')) >> Seperator >> |
| 462 | ( | 456 | ( |
| 463 | ExpList >> -(invoke_args_with_table | TableBlock) | | 457 | Exp >> *(sym(',') >> Exp) >> -(invoke_args_with_table | TableBlock) | |
| 464 | TableBlock | 458 | TableBlock |
| 465 | ); | 459 | ); |
| 466 | 460 | ||
