From 608d895eb523068a2a31de43fc020816b54094d0 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Thu, 19 Aug 2021 16:37:07 +0800 Subject: fix generated codes by variable attribute feature. --- src/yuescript/yue_compiler.cpp | 76 +++++++++++++++++------------------------- 1 file 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" { #endif // LUA_COMPAT_5_1 #endif // LUA_VERSION_NUM +#if LUA_VERSION_NUM < 504 + #define YUE_NO_ATTRIB +#endif // LUA_VERSION_NUM + #endif // YUE_NO_MACRO namespace yue { @@ -56,7 +60,7 @@ using namespace parserlib; typedef std::list str_list; -const std::string_view version = "0.8.1"sv; +const std::string_view version = "0.8.2"sv; const std::string_view extension = "yue"sv; class YueCompilerImpl { @@ -6252,58 +6256,38 @@ private: if (attrib != "close"sv && attrib != "const"sv) { throw std::logic_error(_info.errorMessage("unknown attribute '"s + attrib + '\'', localAttrib->attrib)); } + str_list vars; + for (auto name : localAttrib->nameList->names.objects()) { + auto var = _parser.toString(name); + forceAddToScope(var); + vars.push_back(var); + } +#ifdef YUE_NO_ATTRIB if (attrib == "const"sv) { - str_list vars; - for (auto name : localAttrib->nameList->names.objects()) { - vars.push_back(_parser.toString(name)); - forceAddToScope(vars.back()); - } - str_list temp; - auto varStr = join(vars, ", "sv); - temp.push_back(indent() + "local "s + varStr + nll(x)); - auto varList = toAst(varStr, x); - auto assignment = x->new_ptr(); - assignment->expList.set(varList); - assignment->action.set(localAttrib->assign); - transformAssignment(assignment, temp); - for (const auto& var : vars) { + for (auto& var : vars) { markVarConst(var); } - out.push_back(join(temp)); - return; + } else { + throw std::logic_error(_info.errorMessage("attribute '"s + attrib + "' is not supported", localAttrib->attrib)); } - auto expList = x->new_ptr(); - str_list tmpVars; - str_list vars; - pushScope(); - for (auto name : localAttrib->nameList->names.objects()) { - auto callable = x->new_ptr(); - callable->item.set(name); - auto chainValue = x->new_ptr(); - chainValue->items.push_back(callable); - auto value = x->new_ptr(); - value->item.set(chainValue); - auto exp = newExp(value, x); - expList->exprs.push_back(exp); - tmpVars.push_back(getUnusedName("_var_"sv)); - addToScope(tmpVars.back()); - vars.push_back(_parser.toString(name)); +#else // YUE_NO_ATTRIB + attrib = " <"s + attrib + '>'; + if (attrib == ""sv) { + for (auto& var : vars) { + markVarConst(var); + var.append(attrib); + } + } else { + for (auto& var : vars) { + var.append(attrib); + } } - popScope(); - auto tmpVarStr = join(tmpVars, ", "sv); - auto tmpVarList = toAst(tmpVarStr, x); - auto assignment = x->new_ptr(); - assignment->expList.set(tmpVarList); - assignment->action.set(localAttrib->assign); +#endif // YUE_NO_ATTRIB str_list temp; - transformAssignment(assignment, temp); - attrib = " <"s + attrib + '>'; - for (auto& var : vars) { - forceAddToScope(var); - var.append(attrib); + for (auto item : localAttrib->assign->values.objects()) { + transformAssignItem(item, temp); } - temp.push_back(indent() + "local "s + join(vars, ", "sv) + " = "s + tmpVarStr + nll(x)); - out.push_back(join(temp)); + out.push_back(indent() + "local "s + join(vars, ", "sv) + " = "s + join(temp, ", "sv) + nll(x)); } void transformBreakLoop(BreakLoop_t* breakLoop, str_list& out) { -- cgit v1.2.3-55-g6feb