diff options
author | Li Jin <dragon-fly@qq.com> | 2021-08-19 16:37:07 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2021-08-19 16:37:07 +0800 |
commit | 608d895eb523068a2a31de43fc020816b54094d0 (patch) | |
tree | dc6945f91801886aa9951c4ae96676973e789e51 | |
parent | eb4c34ed2ff266877e90749afa512391e470321b (diff) | |
download | yuescript-0.8.2.tar.gz yuescript-0.8.2.tar.bz2 yuescript-0.8.2.zip |
fix generated codes by variable attribute feature.v0.8.2
-rwxr-xr-x | src/yuescript/yue_compiler.cpp | 76 |
1 files changed, 30 insertions, 46 deletions
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index f2a0b8c..e812960 100755 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
@@ -34,6 +34,10 @@ extern "C" { | |||
34 | #endif // LUA_COMPAT_5_1 | 34 | #endif // LUA_COMPAT_5_1 |
35 | #endif // LUA_VERSION_NUM | 35 | #endif // LUA_VERSION_NUM |
36 | 36 | ||
37 | #if LUA_VERSION_NUM < 504 | ||
38 | #define YUE_NO_ATTRIB | ||
39 | #endif // LUA_VERSION_NUM | ||
40 | |||
37 | #endif // YUE_NO_MACRO | 41 | #endif // YUE_NO_MACRO |
38 | 42 | ||
39 | namespace yue { | 43 | namespace yue { |
@@ -56,7 +60,7 @@ using namespace parserlib; | |||
56 | 60 | ||
57 | typedef std::list<std::string> str_list; | 61 | typedef std::list<std::string> str_list; |
58 | 62 | ||
59 | const std::string_view version = "0.8.1"sv; | 63 | const std::string_view version = "0.8.2"sv; |
60 | const std::string_view extension = "yue"sv; | 64 | const std::string_view extension = "yue"sv; |
61 | 65 | ||
62 | class YueCompilerImpl { | 66 | class YueCompilerImpl { |
@@ -6252,58 +6256,38 @@ private: | |||
6252 | if (attrib != "close"sv && attrib != "const"sv) { | 6256 | if (attrib != "close"sv && attrib != "const"sv) { |
6253 | throw std::logic_error(_info.errorMessage("unknown attribute '"s + attrib + '\'', localAttrib->attrib)); | 6257 | throw std::logic_error(_info.errorMessage("unknown attribute '"s + attrib + '\'', localAttrib->attrib)); |
6254 | } | 6258 | } |
6259 | str_list vars; | ||
6260 | for (auto name : localAttrib->nameList->names.objects()) { | ||
6261 | auto var = _parser.toString(name); | ||
6262 | forceAddToScope(var); | ||
6263 | vars.push_back(var); | ||
6264 | } | ||
6265 | #ifdef YUE_NO_ATTRIB | ||
6255 | if (attrib == "const"sv) { | 6266 | if (attrib == "const"sv) { |
6256 | str_list vars; | 6267 | for (auto& var : vars) { |
6257 | for (auto name : localAttrib->nameList->names.objects()) { | ||
6258 | vars.push_back(_parser.toString(name)); | ||
6259 | forceAddToScope(vars.back()); | ||
6260 | } | ||
6261 | str_list temp; | ||
6262 | auto varStr = join(vars, ", "sv); | ||
6263 | temp.push_back(indent() + "local "s + varStr + nll(x)); | ||
6264 | auto varList = toAst<ExpList_t>(varStr, x); | ||
6265 | auto assignment = x->new_ptr<ExpListAssign_t>(); | ||
6266 | assignment->expList.set(varList); | ||
6267 | assignment->action.set(localAttrib->assign); | ||
6268 | transformAssignment(assignment, temp); | ||
6269 | for (const auto& var : vars) { | ||
6270 | markVarConst(var); | 6268 | markVarConst(var); |
6271 | } | 6269 | } |
6272 | out.push_back(join(temp)); | 6270 | } else { |
6273 | return; | 6271 | throw std::logic_error(_info.errorMessage("attribute '"s + attrib + "' is not supported", localAttrib->attrib)); |
6274 | } | 6272 | } |
6275 | auto expList = x->new_ptr<ExpList_t>(); | 6273 | #else // YUE_NO_ATTRIB |
6276 | str_list tmpVars; | 6274 | attrib = " <"s + attrib + '>'; |
6277 | str_list vars; | 6275 | if (attrib == "<const>"sv) { |
6278 | pushScope(); | 6276 | for (auto& var : vars) { |
6279 | for (auto name : localAttrib->nameList->names.objects()) { | 6277 | markVarConst(var); |
6280 | auto callable = x->new_ptr<Callable_t>(); | 6278 | var.append(attrib); |
6281 | callable->item.set(name); | 6279 | } |
6282 | auto chainValue = x->new_ptr<ChainValue_t>(); | 6280 | } else { |
6283 | chainValue->items.push_back(callable); | 6281 | for (auto& var : vars) { |
6284 | auto value = x->new_ptr<Value_t>(); | 6282 | var.append(attrib); |
6285 | value->item.set(chainValue); | 6283 | } |
6286 | auto exp = newExp(value, x); | ||
6287 | expList->exprs.push_back(exp); | ||
6288 | tmpVars.push_back(getUnusedName("_var_"sv)); | ||
6289 | addToScope(tmpVars.back()); | ||
6290 | vars.push_back(_parser.toString(name)); | ||
6291 | } | 6284 | } |
6292 | popScope(); | 6285 | #endif // YUE_NO_ATTRIB |
6293 | auto tmpVarStr = join(tmpVars, ", "sv); | ||
6294 | auto tmpVarList = toAst<ExpList_t>(tmpVarStr, x); | ||
6295 | auto assignment = x->new_ptr<ExpListAssign_t>(); | ||
6296 | assignment->expList.set(tmpVarList); | ||
6297 | assignment->action.set(localAttrib->assign); | ||
6298 | str_list temp; | 6286 | str_list temp; |
6299 | transformAssignment(assignment, temp); | 6287 | for (auto item : localAttrib->assign->values.objects()) { |
6300 | attrib = " <"s + attrib + '>'; | 6288 | transformAssignItem(item, temp); |
6301 | for (auto& var : vars) { | ||
6302 | forceAddToScope(var); | ||
6303 | var.append(attrib); | ||
6304 | } | 6289 | } |
6305 | temp.push_back(indent() + "local "s + join(vars, ", "sv) + " = "s + tmpVarStr + nll(x)); | 6290 | out.push_back(indent() + "local "s + join(vars, ", "sv) + " = "s + join(temp, ", "sv) + nll(x)); |
6306 | out.push_back(join(temp)); | ||
6307 | } | 6291 | } |
6308 | 6292 | ||
6309 | void transformBreakLoop(BreakLoop_t* breakLoop, str_list& out) { | 6293 | void transformBreakLoop(BreakLoop_t* breakLoop, str_list& out) { |