diff options
Diffstat (limited to 'src/MoonP/moon_parser.cpp')
-rw-r--r-- | src/MoonP/moon_parser.cpp | 33 |
1 files changed, 23 insertions, 10 deletions
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 | ||