diff options
| author | Li Jin <dragon-fly@qq.com> | 2020-11-03 14:21:17 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2020-11-03 14:21:17 +0800 |
| commit | e07a2eb9c389f27103872a3b5a5bfe500d0c2d62 (patch) | |
| tree | e73abc495faa92bab2d9eee9b89afc89f57d1390 | |
| parent | c421550a006c6c01ac176a879593a20d51d77c5d (diff) | |
| download | yuescript-e07a2eb9c389f27103872a3b5a5bfe500d0c2d62.tar.gz yuescript-e07a2eb9c389f27103872a3b5a5bfe500d0c2d62.tar.bz2 yuescript-e07a2eb9c389f27103872a3b5a5bfe500d0c2d62.zip | |
fix issue #29
| -rw-r--r-- | spec/inputs/loops.mp | 6 | ||||
| -rw-r--r-- | src/MoonP/moon_compiler.cpp | 19 |
2 files changed, 15 insertions, 10 deletions
diff --git a/spec/inputs/loops.mp b/spec/inputs/loops.mp index 24d960f..8946a2f 100644 --- a/spec/inputs/loops.mp +++ b/spec/inputs/loops.mp | |||
| @@ -91,6 +91,12 @@ while true | |||
| 91 | break if true | 91 | break if true |
| 92 | print "no" | 92 | print "no" |
| 93 | 93 | ||
| 94 | for i = 1, 10 | ||
| 95 | while true | ||
| 96 | if not true | ||
| 97 | continue | ||
| 98 | break | ||
| 99 | |||
| 94 | a = 1 | 100 | a = 1 |
| 95 | repeat | 101 | repeat |
| 96 | a += 1 | 102 | a += 1 |
diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp index f24441f..138a6bf 100644 --- a/src/MoonP/moon_compiler.cpp +++ b/src/MoonP/moon_compiler.cpp | |||
| @@ -53,7 +53,7 @@ inline std::string s(std::string_view sv) { | |||
| 53 | return std::string(sv); | 53 | return std::string(sv); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | const std::string_view version = "0.4.19"sv; | 56 | const std::string_view version = "0.4.20"sv; |
| 57 | const std::string_view extension = "mp"sv; | 57 | const std::string_view extension = "mp"sv; |
| 58 | 58 | ||
| 59 | class MoonCompilerImpl { | 59 | class MoonCompilerImpl { |
| @@ -3814,17 +3814,16 @@ private: | |||
| 3814 | void transformLoopBody(Body_t* body, str_list& out, const std::string& appendContent, ExpUsage usage, ExpList_t* assignList = nullptr) { | 3814 | void transformLoopBody(Body_t* body, str_list& out, const std::string& appendContent, ExpUsage usage, ExpList_t* assignList = nullptr) { |
| 3815 | str_list temp; | 3815 | str_list temp; |
| 3816 | bool withContinue = traversal::Stop == body->traverse([&](ast_node* node) { | 3816 | bool withContinue = traversal::Stop == body->traverse([&](ast_node* node) { |
| 3817 | switch (node->getId()) { | 3817 | if (auto stmt = ast_cast<Statement_t>(node)) { |
| 3818 | case id<For_t>(): | 3818 | if (stmt->content.is<BreakLoop_t>()) { |
| 3819 | case id<ForEach_t>(): | 3819 | return _parser.toString(stmt->content) == "continue"sv ? |
| 3820 | return traversal::Return; | 3820 | traversal::Stop : traversal::Return; |
| 3821 | case id<BreakLoop_t>(): { | 3821 | } else if (expListFrom(stmt)) { |
| 3822 | return _parser.toString(node) == "continue"sv ? | ||
| 3823 | traversal::Stop : traversal::Return; | ||
| 3824 | } | ||
| 3825 | default: | ||
| 3826 | return traversal::Continue; | 3822 | return traversal::Continue; |
| 3823 | } | ||
| 3824 | return traversal::Return; | ||
| 3827 | } | 3825 | } |
| 3826 | return traversal::Continue; | ||
| 3828 | }); | 3827 | }); |
| 3829 | if (withContinue) { | 3828 | if (withContinue) { |
| 3830 | auto continueVar = getUnusedName("_continue_"sv); | 3829 | auto continueVar = getUnusedName("_continue_"sv); |
