diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/MoonP/moon_ast.h | 17 | ||||
| -rw-r--r-- | src/MoonP/moon_compiler.cpp | 12 | ||||
| -rw-r--r-- | src/MoonP/moon_parser.cpp | 33 | ||||
| -rw-r--r-- | src/MoonP/moon_parser.h | 3 |
4 files changed, 53 insertions, 12 deletions
diff --git a/src/MoonP/moon_ast.h b/src/MoonP/moon_ast.h index 0725bda..3f9ce79 100644 --- a/src/MoonP/moon_ast.h +++ b/src/MoonP/moon_ast.h | |||
| @@ -46,6 +46,11 @@ AST_NODE(Variable) | |||
| 46 | AST_MEMBER(Variable, &name) | 46 | AST_MEMBER(Variable, &name) |
| 47 | AST_END(Variable) | 47 | AST_END(Variable) |
| 48 | 48 | ||
| 49 | AST_NODE(LabelName) | ||
| 50 | ast_ptr<true, Name_t> name; | ||
| 51 | AST_MEMBER(LabelName, &name) | ||
| 52 | AST_END(LabelName) | ||
| 53 | |||
| 49 | AST_NODE(LuaKeyword) | 54 | AST_NODE(LuaKeyword) |
| 50 | ast_ptr<true, Name_t> name; | 55 | ast_ptr<true, Name_t> name; |
| 51 | AST_MEMBER(LuaKeyword, &name) | 56 | AST_MEMBER(LuaKeyword, &name) |
| @@ -142,6 +147,16 @@ AST_NODE(Import) | |||
| 142 | AST_MEMBER(Import, &content) | 147 | AST_MEMBER(Import, &content) |
| 143 | AST_END(Import) | 148 | AST_END(Import) |
| 144 | 149 | ||
| 150 | AST_NODE(Label) | ||
| 151 | ast_ptr<true, LabelName_t> label; | ||
| 152 | AST_MEMBER(Label, &label) | ||
| 153 | AST_END(Label) | ||
| 154 | |||
| 155 | AST_NODE(Goto) | ||
| 156 | ast_ptr<true, LabelName_t> label; | ||
| 157 | AST_MEMBER(Goto, &label) | ||
| 158 | AST_END(Goto) | ||
| 159 | |||
| 145 | class FnArgsDef_t; | 160 | class FnArgsDef_t; |
| 146 | 161 | ||
| 147 | AST_LEAF(fn_arrow_back) | 162 | AST_LEAF(fn_arrow_back) |
| @@ -650,7 +665,7 @@ AST_END(BreakLoop) | |||
| 650 | AST_NODE(Statement) | 665 | AST_NODE(Statement) |
| 651 | ast_sel<true, Import_t, While_t, For_t, ForEach_t, | 666 | ast_sel<true, Import_t, While_t, For_t, ForEach_t, |
| 652 | Return_t, Local_t, Global_t, Export_t, Macro_t, BreakLoop_t, | 667 | Return_t, Local_t, Global_t, Export_t, Macro_t, BreakLoop_t, |
| 653 | Backcall_t, ExpListAssign_t> content; | 668 | Label_t, Goto_t, Backcall_t, ExpListAssign_t> content; |
| 654 | ast_ptr<false, statement_appendix_t> appendix; | 669 | ast_ptr<false, statement_appendix_t> appendix; |
| 655 | AST_MEMBER(Statement, &content, &appendix) | 670 | AST_MEMBER(Statement, &content, &appendix) |
| 656 | AST_END(Statement) | 671 | AST_END(Statement) |
diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp index c176c01..b89f6d1 100644 --- a/src/MoonP/moon_compiler.cpp +++ b/src/MoonP/moon_compiler.cpp | |||
| @@ -43,7 +43,7 @@ inline std::string s(std::string_view sv) { | |||
| 43 | } | 43 | } |
| 44 | 44 | ||
| 45 | const char* moonScriptVersion() { | 45 | const char* moonScriptVersion() { |
| 46 | return "0.5.0-r0.3.4"; | 46 | return "0.5.0-r0.3.5"; |
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | // name of table stored in lua registry | 49 | // name of table stored in lua registry |
| @@ -750,6 +750,8 @@ private: | |||
| 750 | case id<Export_t>(): transformExport(static_cast<Export_t*>(content), out); break; | 750 | case id<Export_t>(): transformExport(static_cast<Export_t*>(content), out); break; |
| 751 | case id<Macro_t>(): transformMacro(static_cast<Macro_t*>(content), out, false); break; | 751 | case id<Macro_t>(): transformMacro(static_cast<Macro_t*>(content), out, false); break; |
| 752 | case id<BreakLoop_t>(): transformBreakLoop(static_cast<BreakLoop_t*>(content), out); break; | 752 | case id<BreakLoop_t>(): transformBreakLoop(static_cast<BreakLoop_t*>(content), out); break; |
| 753 | case id<Label_t>(): transformLabel(static_cast<Label_t*>(content), out); break; | ||
| 754 | case id<Goto_t>(): transformGoto(static_cast<Goto_t*>(content), out); break; | ||
| 753 | case id<ExpListAssign_t>(): { | 755 | case id<ExpListAssign_t>(): { |
| 754 | auto expListAssign = static_cast<ExpListAssign_t*>(content); | 756 | auto expListAssign = static_cast<ExpListAssign_t*>(content); |
| 755 | if (expListAssign->action) { | 757 | if (expListAssign->action) { |
| @@ -4997,6 +4999,14 @@ private: | |||
| 4997 | _buf << indent() << "break"sv << nll(breakLoop); | 4999 | _buf << indent() << "break"sv << nll(breakLoop); |
| 4998 | out.push_back(clearBuf()); | 5000 | out.push_back(clearBuf()); |
| 4999 | } | 5001 | } |
| 5002 | |||
| 5003 | void transformLabel(Label_t* label, str_list& out) { | ||
| 5004 | out.push_back(indent() + s("::"sv) + _parser.toString(label->label) + s("::"sv) + nll(label)); | ||
| 5005 | } | ||
| 5006 | |||
| 5007 | void transformGoto(Goto_t* gotoNode, str_list& out) { | ||
| 5008 | out.push_back(indent() + s("goto "sv) + _parser.toString(gotoNode->label) + nll(gotoNode)); | ||
| 5009 | } | ||
| 5000 | }; | 5010 | }; |
| 5001 | 5011 | ||
| 5002 | const std::string MoonCompilerImpl::Empty; | 5012 | const std::string MoonCompilerImpl::Empty; |
diff --git a/src/MoonP/moon_parser.cpp b/src/MoonP/moon_parser.cpp index c8a3a23..872e30e 100644 --- a/src/MoonP/moon_parser.cpp +++ b/src/MoonP/moon_parser.cpp | |||
| @@ -15,18 +15,18 @@ using namespace std::string_view_literals; | |||
| 15 | 15 | ||
| 16 | std::unordered_set<std::string> LuaKeywords = { | 16 | std::unordered_set<std::string> LuaKeywords = { |
| 17 | "and", "break", "do", "else", "elseif", | 17 | "and", "break", "do", "else", "elseif", |
| 18 | "end", "false", "for", "function", "if", | 18 | "end", "false", "for", "function", "goto", |
| 19 | "in", "local", "nil", "not", "or", | 19 | "if", "in", "local", "nil", "not", |
| 20 | "repeat", "return", "then", "true", "until", | 20 | "or", "repeat", "return", "then", "true", |
| 21 | "while" | 21 | "until", "while" |
| 22 | }; | 22 | }; |
| 23 | 23 | ||
| 24 | std::unordered_set<std::string> Keywords = { | 24 | std::unordered_set<std::string> Keywords = { |
| 25 | "and", "break", "do", "else", "elseif", | 25 | "and", "break", "do", "else", "elseif", |
| 26 | "end", "false", "for", "function", "if", | 26 | "end", "false", "for", "function", "goto", |
| 27 | "in", "local", "nil", "not", "or", | 27 | "if", "in", "local", "nil", "not", |
| 28 | "repeat", "return", "then", "true", "until", | 28 | "or", "repeat", "return", "then", "true", |
| 29 | "while", // Lua keywords | 29 | "until", "while", // Lua keywords |
| 30 | "as", "class", "continue", "export", "extends", | 30 | "as", "class", "continue", "export", "extends", |
| 31 | "from", "global", "import", "macro", "switch", | 31 | "from", "global", "import", "macro", "switch", |
| 32 | "unless", "using", "when", "with" // Moon keywords | 32 | "unless", "using", "when", "with" // Moon keywords |
| @@ -85,6 +85,14 @@ MoonParser::MoonParser() { | |||
| 85 | return isValid; | 85 | return isValid; |
| 86 | }); | 86 | }); |
| 87 | 87 | ||
| 88 | LabelName = pl::user(Name, [](const item_t& item) { | ||
| 89 | State* st = reinterpret_cast<State*>(item.user_data); | ||
| 90 | for (auto it = item.begin; it != item.end; ++it) st->buffer += static_cast<char>(*it); | ||
| 91 | auto isValid = LuaKeywords.find(st->buffer) == LuaKeywords.end(); | ||
| 92 | st->buffer.clear(); | ||
| 93 | return isValid; | ||
| 94 | }); | ||
| 95 | |||
| 88 | LuaKeyword = pl::user(Name, [](const item_t& item) { | 96 | LuaKeyword = pl::user(Name, [](const item_t& item) { |
| 89 | State* st = reinterpret_cast<State*>(item.user_data); | 97 | State* st = reinterpret_cast<State*>(item.user_data); |
| 90 | for (auto it = item.begin; it != item.end; ++it) st->buffer += static_cast<char>(*it); | 98 | for (auto it = item.begin; it != item.end; ++it) st->buffer += static_cast<char>(*it); |
| @@ -191,9 +199,14 @@ MoonParser::MoonParser() { | |||
| 191 | 199 | ||
| 192 | Import = key("import") >> (ImportAs | ImportFrom); | 200 | Import = key("import") >> (ImportAs | ImportFrom); |
| 193 | 201 | ||
| 202 | Label = Space >> expr("::") >> LabelName >> expr("::"); | ||
| 203 | |||
| 204 | Goto = key("goto") >> Space >> LabelName; | ||
| 205 | |||
| 194 | BreakLoop = (expr("break") | expr("continue")) >> not_(AlphaNum); | 206 | BreakLoop = (expr("break") | expr("continue")) >> not_(AlphaNum); |
| 195 | 207 | ||
| 196 | Return = key("return") >> -ExpListLow; | 208 | Return = key("return") >> -ExpListLow; |
| 209 | |||
| 197 | WithExp = ExpList >> -Assign; | 210 | WithExp = ExpList >> -Assign; |
| 198 | 211 | ||
| 199 | With = key("with") >> DisableDo >> ensure(WithExp, PopDo) >> -key("do") >> Body; | 212 | With = key("with") >> DisableDo >> ensure(WithExp, PopDo) >> -key("do") >> Body; |
| @@ -527,8 +540,8 @@ MoonParser::MoonParser() { | |||
| 527 | Statement = ( | 540 | Statement = ( |
| 528 | Import | While | For | ForEach | | 541 | Import | While | For | ForEach | |
| 529 | Return | Local | Global | Export | | 542 | Return | Local | Global | Export | |
| 530 | Macro | Space >> BreakLoop | | 543 | Macro | Space >> BreakLoop | Label | |
| 531 | Backcall | ExpListAssign | 544 | Goto | Backcall | ExpListAssign |
| 532 | ) >> Space >> | 545 | ) >> Space >> |
| 533 | -statement_appendix; | 546 | -statement_appendix; |
| 534 | 547 | ||
diff --git a/src/MoonP/moon_parser.h b/src/MoonP/moon_parser.h index 4d67696..cea14fa 100644 --- a/src/MoonP/moon_parser.h +++ b/src/MoonP/moon_parser.h | |||
| @@ -182,6 +182,7 @@ private: | |||
| 182 | AST_RULE(Num) | 182 | AST_RULE(Num) |
| 183 | AST_RULE(Name) | 183 | AST_RULE(Name) |
| 184 | AST_RULE(Variable) | 184 | AST_RULE(Variable) |
| 185 | AST_RULE(LabelName) | ||
| 185 | AST_RULE(LuaKeyword) | 186 | AST_RULE(LuaKeyword) |
| 186 | AST_RULE(self) | 187 | AST_RULE(self) |
| 187 | AST_RULE(self_name) | 188 | AST_RULE(self_name) |
| @@ -201,6 +202,8 @@ private: | |||
| 201 | AST_RULE(ImportFrom) | 202 | AST_RULE(ImportFrom) |
| 202 | AST_RULE(ImportAs) | 203 | AST_RULE(ImportAs) |
| 203 | AST_RULE(Import) | 204 | AST_RULE(Import) |
| 205 | AST_RULE(Label) | ||
| 206 | AST_RULE(Goto) | ||
| 204 | AST_RULE(fn_arrow_back) | 207 | AST_RULE(fn_arrow_back) |
| 205 | AST_RULE(Backcall) | 208 | AST_RULE(Backcall) |
| 206 | AST_RULE(ExpListLow) | 209 | AST_RULE(ExpListLow) |
