aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2021-02-10 20:45:46 +0800
committerLi Jin <dragon-fly@qq.com>2021-02-10 20:50:54 +0800
commit90e5ee7ee432f558b3c55d79fba1fcb2a8ce502f (patch)
tree3b3dd29a627dc16448d6fa628559f65bcd405dac /src
parentc68e11bc6d7631185749aaf0c8d89147b3ac9cc9 (diff)
downloadyuescript-90e5ee7ee432f558b3c55d79fba1fcb2a8ce502f.tar.gz
yuescript-90e5ee7ee432f558b3c55d79fba1fcb2a8ce502f.tar.bz2
yuescript-90e5ee7ee432f558b3c55d79fba1fcb2a8ce502f.zip
fix issue #38 with a better solution.
Diffstat (limited to 'src')
-rw-r--r--src/MoonP/moon_compiler.cpp2
-rw-r--r--src/MoonP/moon_parser.cpp22
-rw-r--r--src/MoonP/moon_parser.h5
3 files changed, 26 insertions, 3 deletions
diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp
index 11d4ed8..2ed153e 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
56const std::string_view version = "0.6.0"sv; 56const std::string_view version = "0.6.1"sv;
57const std::string_view extension = "mp"sv; 57const std::string_view extension = "mp"sv;
58 58
59class MoonCompilerImpl { 59class MoonCompilerImpl {
diff --git a/src/MoonP/moon_parser.cpp b/src/MoonP/moon_parser.cpp
index f15492f..aafe730 100644
--- a/src/MoonP/moon_parser.cpp
+++ b/src/MoonP/moon_parser.cpp
@@ -219,7 +219,7 @@ MoonParser::MoonParser() {
219 219
220 Return = key("return") >> -ExpListLow; 220 Return = key("return") >> -ExpListLow;
221 221
222 WithExp = ExpList >> -Assign; 222 WithExp = DisableChainBlock >> ensure(ExpList >> -Assign, PopChainBlock);
223 223
224 With = key("with") >> -existential_op >> DisableDo >> ensure(WithExp, PopDo) >> -key("do") >> Body; 224 With = key("with") >> -existential_op >> DisableDo >> ensure(WithExp, PopDo) >> -key("do") >> Body;
225 SwitchCase = key("when") >> ExpList >> -key("then") >> Body; 225 SwitchCase = key("when") >> ExpList >> -key("then") >> Body;
@@ -338,7 +338,25 @@ MoonParser::MoonParser() {
338 exp_op_value = Space >> BinaryOperator >> *SpaceBreak >> backcall_exp; 338 exp_op_value = Space >> BinaryOperator >> *SpaceBreak >> backcall_exp;
339 Exp = Seperator >> backcall_exp >> *exp_op_value; 339 Exp = Seperator >> backcall_exp >> *exp_op_value;
340 340
341 ChainValue = Seperator >> (Chain | Callable) >> -existential_op >> -InvokeArgs; 341 DisableChainBlock = pl::user(true_(), [](const item_t& item) {
342 State* st = reinterpret_cast<State*>(item.user_data);
343 st->chainBlockStack.push(false);
344 return true;
345 });
346
347 PopChainBlock = pl::user(true_(), [](const item_t& item) {
348 State* st = reinterpret_cast<State*>(item.user_data);
349 st->chainBlockStack.pop();
350 return true;
351 });
352
353 chain_line = CheckIndent >> (chain_item | Space >> (chain_dot_chain | ColonChain)) >> -InvokeArgs;
354 chain_block = pl::user(true_(), [](const item_t& item) {
355 State* st = reinterpret_cast<State*>(item.user_data);
356 return st->chainBlockStack.empty() || st->chainBlockStack.top();
357 }) >> +SpaceBreak >> Advance >> ensure(
358 chain_line >> *(+SpaceBreak >> chain_line), PopIndent);
359 ChainValue = Seperator >> (Chain | Callable) >> -existential_op >> (chain_block | -InvokeArgs);
342 360
343 simple_table = Seperator >> KeyValue >> *(sym(',') >> KeyValue); 361 simple_table = Seperator >> KeyValue >> *(sym(',') >> KeyValue);
344 Value = SimpleValue | simple_table | ChainValue | String; 362 Value = SimpleValue | simple_table | ChainValue | String;
diff --git a/src/MoonP/moon_parser.h b/src/MoonP/moon_parser.h
index bee3c9c..66f2cd9 100644
--- a/src/MoonP/moon_parser.h
+++ b/src/MoonP/moon_parser.h
@@ -78,6 +78,7 @@ protected:
78 std::string buffer; 78 std::string buffer;
79 std::stack<int> indents; 79 std::stack<int> indents;
80 std::stack<bool> doStack; 80 std::stack<bool> doStack;
81 std::stack<bool> chainBlockStack;
81 }; 82 };
82 83
83 template <class T> 84 template <class T>
@@ -155,6 +156,10 @@ private:
155 rule ColonChain; 156 rule ColonChain;
156 rule chain_with_colon; 157 rule chain_with_colon;
157 rule ChainItem; 158 rule ChainItem;
159 rule chain_line;
160 rule chain_block;
161 rule DisableChainBlock;
162 rule PopChainBlock;
158 rule Index; 163 rule Index;
159 rule invoke_chain; 164 rule invoke_chain;
160 rule TableValue; 165 rule TableValue;