summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/yuescript/yue_compiler.cpp76
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
39namespace yue { 43namespace yue {
@@ -56,7 +60,7 @@ using namespace parserlib;
56 60
57typedef std::list<std::string> str_list; 61typedef std::list<std::string> str_list;
58 62
59const std::string_view version = "0.8.1"sv; 63const std::string_view version = "0.8.2"sv;
60const std::string_view extension = "yue"sv; 64const std::string_view extension = "yue"sv;
61 65
62class YueCompilerImpl { 66class 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) {