From 975167856ed0b11c2ede03c6eb750ca4e4a6a7fc Mon Sep 17 00:00:00 2001 From: Li Jin Date: Tue, 29 Oct 2019 11:25:27 +0800 Subject: complete moon compiler in C++. --- MoonParser/moon_parser.cpp | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'MoonParser/moon_parser.cpp') diff --git a/MoonParser/moon_parser.cpp b/MoonParser/moon_parser.cpp index d709e29..2b93c22 100644 --- a/MoonParser/moon_parser.cpp +++ b/MoonParser/moon_parser.cpp @@ -1,5 +1,7 @@ #include "moon_parser.h" +namespace MoonP { + std::unordered_set State::luaKeywords = { "and", "break", "do", "else", "elseif", "end", "false", "for", "function", "if", @@ -14,8 +16,8 @@ std::unordered_set State::keywords = { "in", "local", "nil", "not", "or", "repeat", "return", "then", "true", "until", "while", // Lua keywords - "class", "continue", "export", "extends", - "import", "switch", "when", "unless", "using", + "class", "continue", "export", "extends", "from", + "import", "switch", "unless", "using", "when", "with" // Moon keywords }; @@ -35,10 +37,7 @@ rule Name = (range('a', 'z') | range('A', 'Z') | '_') >> *AlphaNum; rule Num = ( "0x" >> - +(range('0', '9') | range('a', 'f') | range('A', 'F')) >> - -(-set("uU") >> set("lL") >> set("lL")) - ) | ( - +range('0', '9') >> -set("uU") >> set("lL") >> set("lL") + +(range('0', '9') | range('a', 'f') | range('A', 'F')) ) | ( ( (+range('0', '9') >> -('.' >> +range('0', '9'))) | @@ -56,9 +55,17 @@ rule Seperator = true_(); rule Variable = user(Name, [](const item_t& item) { State* st = reinterpret_cast(item.user_data); for (auto it = item.begin; it != item.end; ++it) st->buffer += static_cast(*it); - auto it = st->keywords.find(st->buffer); + auto it = State::keywords.find(st->buffer); + st->buffer.clear(); + return it == State::keywords.end(); +}); + +rule LuaKeyword = user(Name, [](const item_t& item) { + State* st = reinterpret_cast(item.user_data); + for (auto it = item.begin; it != item.end; ++it) st->buffer += static_cast(*it); + auto it = State::luaKeywords.find(st->buffer); st->buffer.clear(); - return it == st->keywords.end(); + return it != State::luaKeywords.end(); }); rule self = expr('@'); @@ -344,7 +351,7 @@ extern rule Invoke, Slice; rule Index = symx('[') >> Exp >> sym(']'); rule ChainItem = Invoke | DotChainItem | Slice | Index; rule DotChainItem = symx('.') >> Name; -rule ColonChainItem = symx('\\') >> Name; +rule ColonChainItem = symx('\\') >> (LuaKeyword | Name); rule invoke_chain = Invoke >> -ChainItems; rule ColonChain = ColonChainItem >> -invoke_chain; @@ -480,7 +487,7 @@ rule SimpleValue = TblComprehension | TableLit | Comprehension | FunLit | (Space >> Num); -rule Assignment = ExpList >> (Update | Assign); +rule ExpListAssign = ExpList >> -(Update | Assign); rule if_else_line = key("if") >> Exp >> (key("else") >> Exp | default_value); rule unless_line = key("unless") >> Exp; @@ -490,7 +497,7 @@ rule Statement = ( Import | While | For | ForEach | Return | Local | Export | Space >> BreakLoop | - Assignment | ExpList + ExpListAssign ) >> Space >> -statement_appendix; @@ -502,3 +509,5 @@ rule Block = Seperator >> Line >> *(+Break >> Line); rule Shebang = expr("#!") >> *(not_(Stop) >> Any); rule File = White >> -Shebang >> Block >> eof(); + +} // namespace MoonP -- cgit v1.2.3-55-g6feb