diff options
| author | Li Jin <dragon-fly@qq.com> | 2020-01-25 01:33:40 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2020-01-25 01:33:40 +0800 |
| commit | 96e0f5d1d7b3d0b3cf278b82ef6819dbfac96219 (patch) | |
| tree | e1766fd2bcfcf4022da08593f57597b9b4677786 | |
| parent | 4465a18f396212e177211f57c5c97cea444a0061 (diff) | |
| download | yuescript-96e0f5d1d7b3d0b3cf278b82ef6819dbfac96219.tar.gz yuescript-96e0f5d1d7b3d0b3cf278b82ef6819dbfac96219.tar.bz2 yuescript-96e0f5d1d7b3d0b3cf278b82ef6819dbfac96219.zip | |
fix chain value issue.
Diffstat (limited to '')
| -rw-r--r-- | spec/inputs/existential.moon | 3 | ||||
| -rw-r--r-- | src/MoonP/moon_compiler.cpp | 41 |
2 files changed, 31 insertions, 13 deletions
diff --git a/spec/inputs/existential.moon b/spec/inputs/existential.moon index eaa3266..e8e2249 100644 --- a/spec/inputs/existential.moon +++ b/spec/inputs/existential.moon | |||
| @@ -17,4 +17,5 @@ with abc?!\func?! | |||
| 17 | if {:x} = a?.if?\then?(123)? @?\function 998 | 17 | if {:x} = a?.if?\then?(123)? @?\function 998 |
| 18 | print x | 18 | print x |
| 19 | 19 | ||
| 20 | 20 | res = b.function\do!\while("OK")\if("def",998)\f? | |
| 21 | print res | ||
diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp index ca0ab5b..020e561 100644 --- a/src/MoonP/moon_compiler.cpp +++ b/src/MoonP/moon_compiler.cpp | |||
| @@ -426,20 +426,31 @@ private: | |||
| 426 | return ast_is<InvokeArgs_t, Invoke_t>(chainValue->items.back()); | 426 | return ast_is<InvokeArgs_t, Invoke_t>(chainValue->items.back()); |
| 427 | } | 427 | } |
| 428 | 428 | ||
| 429 | bool isSpecialChainValue(ChainValue_t* chainValue) { | 429 | enum class ChainType { |
| 430 | Common, | ||
| 431 | EndWithColon, | ||
| 432 | EndWithEOP, | ||
| 433 | HasEOP, | ||
| 434 | HasKeyword | ||
| 435 | }; | ||
| 436 | |||
| 437 | ChainType specialChainValue(ChainValue_t* chainValue) { | ||
| 430 | if (ast_is<ColonChainItem_t>(chainValue->items.back())) { | 438 | if (ast_is<ColonChainItem_t>(chainValue->items.back())) { |
| 431 | return true; | 439 | return ChainType::EndWithColon; |
| 440 | } | ||
| 441 | if (ast_is<existential_op_t>(chainValue->items.back())) { | ||
| 442 | return ChainType::EndWithEOP; | ||
| 432 | } | 443 | } |
| 433 | for (auto item : chainValue->items.objects()) { | 444 | for (auto item : chainValue->items.objects()) { |
| 434 | if (auto colonChain = ast_cast<ColonChainItem_t>(item)) { | 445 | if (auto colonChain = ast_cast<ColonChainItem_t>(item)) { |
| 435 | if (ast_is<LuaKeyword_t>(colonChain->name)) { | 446 | if (ast_is<LuaKeyword_t>(colonChain->name)) { |
| 436 | return true; | 447 | return ChainType::HasKeyword; |
| 437 | } | 448 | } |
| 438 | } else if (ast_is<existential_op_t>(item) && item != chainValue->items.back()) { | 449 | } else if (ast_is<existential_op_t>(item) && item != chainValue->items.back()) { |
| 439 | return true; | 450 | return ChainType::HasEOP; |
| 440 | } | 451 | } |
| 441 | } | 452 | } |
| 442 | return false; | 453 | return ChainType::Common; |
| 443 | } | 454 | } |
| 444 | 455 | ||
| 445 | std::string singleVariableFrom(ChainValue_t* chainValue) { | 456 | std::string singleVariableFrom(ChainValue_t* chainValue) { |
| @@ -998,16 +1009,22 @@ private: | |||
| 998 | auto exp = ast_cast<Exp_t>(value); | 1009 | auto exp = ast_cast<Exp_t>(value); |
| 999 | BREAK_IF(!exp); | 1010 | BREAK_IF(!exp); |
| 1000 | if (auto chainValue = exp->value->item.as<ChainValue_t>()) { | 1011 | if (auto chainValue = exp->value->item.as<ChainValue_t>()) { |
| 1001 | if (isSpecialChainValue(chainValue)) { | 1012 | auto type = specialChainValue(chainValue); |
| 1002 | auto expList = assignment->expList.get(); | 1013 | auto expList = assignment->expList.get(); |
| 1003 | if (ast_is<ColonChainItem_t>(chainValue->items.back())) { | 1014 | switch (type) { |
| 1015 | case ChainType::HasEOP: | ||
| 1016 | case ChainType::EndWithColon: { | ||
| 1004 | std::string preDefine = getPredefine(assignment); | 1017 | std::string preDefine = getPredefine(assignment); |
| 1005 | transformChainValue(chainValue, out, ExpUsage::Assignment, expList); | 1018 | transformChainValue(chainValue, out, ExpUsage::Assignment, expList); |
| 1006 | out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); | 1019 | out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); |
| 1007 | } else { | 1020 | return; |
| 1008 | transformChainValue(chainValue, out, ExpUsage::Assignment, expList); | ||
| 1009 | } | 1021 | } |
| 1010 | return; | 1022 | case ChainType::HasKeyword: |
| 1023 | transformChainValue(chainValue, out, ExpUsage::Assignment, expList); | ||
| 1024 | return; | ||
| 1025 | case ChainType::Common: | ||
| 1026 | case ChainType::EndWithEOP: | ||
| 1027 | break; | ||
| 1011 | } | 1028 | } |
| 1012 | } | 1029 | } |
| 1013 | BLOCK_END | 1030 | BLOCK_END |
| @@ -1858,7 +1875,7 @@ private: | |||
| 1858 | } | 1875 | } |
| 1859 | } | 1876 | } |
| 1860 | if (auto chainValue = singleValue->item.as<ChainValue_t>()) { | 1877 | if (auto chainValue = singleValue->item.as<ChainValue_t>()) { |
| 1861 | if (isSpecialChainValue(chainValue)) { | 1878 | if (specialChainValue(chainValue) != ChainType::Common) { |
| 1862 | transformChainValue(chainValue, out, ExpUsage::Return); | 1879 | transformChainValue(chainValue, out, ExpUsage::Return); |
| 1863 | return; | 1880 | return; |
| 1864 | } | 1881 | } |
