diff options
| author | Li Jin <dragon-fly@qq.com> | 2025-12-25 00:00:08 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2025-12-25 00:00:08 +0800 |
| commit | 7ee395d918b97795f151c24ed877bfcc2edf602a (patch) | |
| tree | 0fbb5f4d3011ee6459e011416a1307d74cf331a7 /src | |
| parent | bb563257953628a9849c8532a684b5064bf8e655 (diff) | |
| download | yuescript-7ee395d918b97795f151c24ed877bfcc2edf602a.tar.gz yuescript-7ee395d918b97795f151c24ed877bfcc2edf602a.tar.bz2 yuescript-7ee395d918b97795f151c24ed877bfcc2edf602a.zip | |
Added named vararg support.
Diffstat (limited to '')
| -rw-r--r-- | src/yuescript/yue_ast.cpp | 3 | ||||
| -rw-r--r-- | src/yuescript/yue_ast.h | 7 | ||||
| -rw-r--r-- | src/yuescript/yue_compiler.cpp | 29 | ||||
| -rw-r--r-- | src/yuescript/yue_parser.cpp | 5 | ||||
| -rw-r--r-- | src/yuescript/yue_parser.h | 1 |
5 files changed, 35 insertions, 10 deletions
diff --git a/src/yuescript/yue_ast.cpp b/src/yuescript/yue_ast.cpp index be0ec45..55b5d03 100644 --- a/src/yuescript/yue_ast.cpp +++ b/src/yuescript/yue_ast.cpp | |||
| @@ -82,6 +82,9 @@ std::string SelfClass_t::to_string(void*) const { | |||
| 82 | std::string VarArg_t::to_string(void*) const { | 82 | std::string VarArg_t::to_string(void*) const { |
| 83 | return "..."s; | 83 | return "..."s; |
| 84 | } | 84 | } |
| 85 | std::string VarArgDef_t::to_string(void* ud) const { | ||
| 86 | return "..."s + name->to_string(ud); | ||
| 87 | } | ||
| 85 | std::string Seperator_t::to_string(void*) const { | 88 | std::string Seperator_t::to_string(void*) const { |
| 86 | return {}; | 89 | return {}; |
| 87 | } | 90 | } |
diff --git a/src/yuescript/yue_ast.h b/src/yuescript/yue_ast.h index b7cd73e..885a038 100644 --- a/src/yuescript/yue_ast.h +++ b/src/yuescript/yue_ast.h | |||
| @@ -134,6 +134,11 @@ AST_NODE(KeyName) | |||
| 134 | AST_MEMBER(KeyName, &name) | 134 | AST_MEMBER(KeyName, &name) |
| 135 | AST_END(KeyName) | 135 | AST_END(KeyName) |
| 136 | 136 | ||
| 137 | AST_NODE(VarArgDef) | ||
| 138 | ast_ptr<false, Variable_t> name; | ||
| 139 | AST_MEMBER(VarArgDef, &name) | ||
| 140 | AST_END(VarArgDef) | ||
| 141 | |||
| 137 | AST_LEAF(VarArg) | 142 | AST_LEAF(VarArg) |
| 138 | AST_END(VarArg) | 143 | AST_END(VarArg) |
| 139 | 144 | ||
| @@ -790,7 +795,7 @@ AST_END(FnArgDef) | |||
| 790 | AST_NODE(FnArgDefList) | 795 | AST_NODE(FnArgDefList) |
| 791 | ast_ptr<true, Seperator_t> sep; | 796 | ast_ptr<true, Seperator_t> sep; |
| 792 | ast_list<false, FnArgDef_t> definitions; | 797 | ast_list<false, FnArgDef_t> definitions; |
| 793 | ast_ptr<false, VarArg_t> varArg; | 798 | ast_ptr<false, VarArgDef_t> varArg; |
| 794 | ast_ptr<false, Name_t> label; | 799 | ast_ptr<false, Name_t> label; |
| 795 | AST_MEMBER(FnArgDefList, &sep, &definitions, &varArg, &label) | 800 | AST_MEMBER(FnArgDefList, &sep, &definitions, &varArg, &label) |
| 796 | AST_END(FnArgDefList) | 801 | AST_END(FnArgDefList) |
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 77643d3..cae01dd 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
| @@ -78,7 +78,7 @@ static std::unordered_set<std::string> Metamethods = { | |||
| 78 | "close"s // Lua 5.4 | 78 | "close"s // Lua 5.4 |
| 79 | }; | 79 | }; |
| 80 | 80 | ||
| 81 | const std::string_view version = "0.30.3"sv; | 81 | const std::string_view version = "0.30.4"sv; |
| 82 | const std::string_view extension = "yue"sv; | 82 | const std::string_view extension = "yue"sv; |
| 83 | 83 | ||
| 84 | class CompileError : public std::logic_error { | 84 | class CompileError : public std::logic_error { |
| @@ -5872,18 +5872,33 @@ private: | |||
| 5872 | temp.emplace_back(indent() + "local "s + join(names, ", "sv) + nl(def)); | 5872 | temp.emplace_back(indent() + "local "s + join(names, ", "sv) + nl(def)); |
| 5873 | transformAssignment(arg.assignment, temp); | 5873 | transformAssignment(arg.assignment, temp); |
| 5874 | } | 5874 | } |
| 5875 | if (varNames.empty()) | 5875 | if (varNames.empty()) { |
| 5876 | varNames = arg.name; | 5876 | varNames = arg.name; |
| 5877 | else | 5877 | } else { |
| 5878 | varNames.append(", "s + arg.name); | 5878 | varNames.append(", "s + arg.name); |
| 5879 | } | ||
| 5879 | } | 5880 | } |
| 5880 | if (argDefList->varArg) { | 5881 | if (argDefList->varArg) { |
| 5882 | std::string varStr; | ||
| 5883 | if (auto varName = argDefList->varArg->name.get()) { | ||
| 5884 | varStr = variableToString(varName); | ||
| 5885 | int target = getLuaTarget(varName); | ||
| 5886 | forceAddToScope(varStr); | ||
| 5887 | if (target < 505) { | ||
| 5888 | temp.push_back(indent() + "local "s + varStr + " = {"s + nl(varName)); | ||
| 5889 | temp.push_back(indent(1) + "n = "s + globalVar("select", varName, AccessType::Read) + "(\"#\", ...),"s + nl(varName)); | ||
| 5890 | temp.push_back(indent(1) + "..."s + nl(varName)); | ||
| 5891 | temp.push_back(indent() + '}' + nl(varName)); | ||
| 5892 | varStr.clear(); | ||
| 5893 | } | ||
| 5894 | } | ||
| 5881 | auto& arg = argItems.emplace_back(); | 5895 | auto& arg = argItems.emplace_back(); |
| 5882 | arg.name = "..."sv; | 5896 | arg.name = "..."sv; |
| 5883 | if (varNames.empty()) | 5897 | if (varNames.empty()) { |
| 5884 | varNames = arg.name; | 5898 | varNames = arg.name + varStr; |
| 5885 | else | 5899 | } else { |
| 5886 | varNames.append(", "s + arg.name); | 5900 | varNames.append(", "s + arg.name + varStr); |
| 5901 | } | ||
| 5887 | _varArgs.top().hasVar = true; | 5902 | _varArgs.top().hasVar = true; |
| 5888 | } | 5903 | } |
| 5889 | if (assignSelf) { | 5904 | if (assignSelf) { |
diff --git a/src/yuescript/yue_parser.cpp b/src/yuescript/yue_parser.cpp index 1999721..17b10c6 100644 --- a/src/yuescript/yue_parser.cpp +++ b/src/yuescript/yue_parser.cpp | |||
| @@ -308,6 +308,7 @@ YueParser::YueParser() { | |||
| 308 | 308 | ||
| 309 | SelfItem = SelfClassName | SelfClass | SelfName | Self; | 309 | SelfItem = SelfClassName | SelfClass | SelfName | Self; |
| 310 | KeyName = SelfItem | Name | UnicodeName; | 310 | KeyName = SelfItem | Name | UnicodeName; |
| 311 | VarArgDef = "..." >> -(space >> Variable); | ||
| 311 | VarArg = "..."; | 312 | VarArg = "..."; |
| 312 | 313 | ||
| 313 | auto getIndent = [](const item_t& item) -> int { | 314 | auto getIndent = [](const item_t& item) -> int { |
| @@ -1032,8 +1033,8 @@ YueParser::YueParser() { | |||
| 1032 | check_vararg_position = and_(white >> (')' | key("using"))) | white >> -(',' >> white) >> vararg_position_error; | 1033 | check_vararg_position = and_(white >> (')' | key("using"))) | white >> -(',' >> white) >> vararg_position_error; |
| 1033 | 1034 | ||
| 1034 | var_arg_def = ( | 1035 | var_arg_def = ( |
| 1035 | VarArg | | 1036 | VarArgDef | |
| 1036 | +space_break >> push_indent_match >> ensure(space >> VarArg >> -(space >> '`' >> space >> Name), pop_indent) | 1037 | +space_break >> push_indent_match >> ensure(space >> VarArgDef >> -(space >> '`' >> space >> Name), pop_indent) |
| 1037 | ) >> check_vararg_position; | 1038 | ) >> check_vararg_position; |
| 1038 | 1039 | ||
| 1039 | FnArgDefList = Seperator >> | 1040 | FnArgDefList = Seperator >> |
diff --git a/src/yuescript/yue_parser.h b/src/yuescript/yue_parser.h index b68742f..7deaa18 100644 --- a/src/yuescript/yue_parser.h +++ b/src/yuescript/yue_parser.h | |||
| @@ -333,6 +333,7 @@ private: | |||
| 333 | AST_RULE(SelfItem); | 333 | AST_RULE(SelfItem); |
| 334 | AST_RULE(KeyName); | 334 | AST_RULE(KeyName); |
| 335 | AST_RULE(VarArg); | 335 | AST_RULE(VarArg); |
| 336 | AST_RULE(VarArgDef); | ||
| 336 | AST_RULE(Seperator); | 337 | AST_RULE(Seperator); |
| 337 | AST_RULE(NameList); | 338 | AST_RULE(NameList); |
| 338 | AST_RULE(LocalFlag); | 339 | AST_RULE(LocalFlag); |
