diff options
| author | Li Jin <dragon-fly@qq.com> | 2020-10-15 09:38:01 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2020-10-15 09:38:01 +0800 |
| commit | 2a7256ea8cb8a292d8f395c13ed2462df4c084a0 (patch) | |
| tree | 03600fe01a7b4fd6c49f80eb1e570503bdc5bee4 /src/MoonP/moon_parser.cpp | |
| parent | b4687f90305c24149a5d43d84bf64fa192dae8f8 (diff) | |
| download | yuescript-2a7256ea8cb8a292d8f395c13ed2462df4c084a0.tar.gz yuescript-2a7256ea8cb8a292d8f395c13ed2462df4c084a0.tar.bz2 yuescript-2a7256ea8cb8a292d8f395c13ed2462df4c084a0.zip | |
add support to import all macros from a module with symbol '$' in import-as statement.
fix import macro rename issue.
Diffstat (limited to 'src/MoonP/moon_parser.cpp')
| -rw-r--r-- | src/MoonP/moon_parser.cpp | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/src/MoonP/moon_parser.cpp b/src/MoonP/moon_parser.cpp index 41db324..6485e46 100644 --- a/src/MoonP/moon_parser.cpp +++ b/src/MoonP/moon_parser.cpp | |||
| @@ -51,19 +51,23 @@ MoonParser::MoonParser() { | |||
| 51 | EmptyLine = SpaceBreak; | 51 | EmptyLine = SpaceBreak; |
| 52 | AlphaNum = range('a', 'z') | range('A', 'Z') | range('0', '9') | '_'; | 52 | AlphaNum = range('a', 'z') | range('A', 'Z') | range('0', '9') | '_'; |
| 53 | Name = (range('a', 'z') | range('A', 'Z') | '_') >> *AlphaNum; | 53 | Name = (range('a', 'z') | range('A', 'Z') | '_') >> *AlphaNum; |
| 54 | Num = | 54 | Decimal = ( |
| 55 | ( | ||
| 56 | +range('0', '9') >> -('.' >> +range('0', '9')) | ||
| 57 | ) | ( | ||
| 58 | '.' >> +range('0', '9') | ||
| 59 | ) | ||
| 60 | ) >> -(set("eE") >> -expr('-') >> +range('0', '9')); | ||
| 61 | Integer = | ||
| 55 | ( | 62 | ( |
| 56 | "0x" >> | 63 | "0x" >> |
| 57 | +(range('0', '9') | range('a', 'f') | range('A', 'F')) >> | 64 | +(range('0', '9') | range('a', 'f') | range('A', 'F')) >> |
| 58 | -(-set("uU") >> set("lL") >> set("lL")) | 65 | -(-set("uU") >> set("lL") >> set("lL")) |
| 59 | ) | ( | 66 | ) | ( |
| 60 | +range('0', '9') >> -set("uU") >> set("lL") >> set("lL") | 67 | +range('0', '9') >> -set("uU") >> set("lL") >> set("lL") |
| 61 | ) | ( | ||
| 62 | ( | ||
| 63 | (+range('0', '9') >> -('.' >> +range('0', '9'))) | | ||
| 64 | ('.' >> +range('0', '9')) | ||
| 65 | ) >> -(set("eE") >> -expr('-') >> +range('0', '9')) | ||
| 66 | ); | 68 | ); |
| 69 | Num = Integer | Decimal; | ||
| 70 | |||
| 67 | Cut = false_(); | 71 | Cut = false_(); |
| 68 | Seperator = true_(); | 72 | Seperator = true_(); |
| 69 | 73 | ||
| @@ -185,26 +189,28 @@ MoonParser::MoonParser() { | |||
| 185 | colon_import_name = sym('\\') >> Space >> Variable; | 189 | colon_import_name = sym('\\') >> Space >> Variable; |
| 186 | ImportName = colon_import_name | Space >> Variable; | 190 | ImportName = colon_import_name | Space >> Variable; |
| 187 | ImportNameList = Seperator >> *SpaceBreak >> ImportName >> *((+SpaceBreak | sym(',') >> *SpaceBreak) >> ImportName); | 191 | ImportNameList = Seperator >> *SpaceBreak >> ImportName >> *((+SpaceBreak | sym(',') >> *SpaceBreak) >> ImportName); |
| 192 | ImportFrom = ImportNameList >> *SpaceBreak >> key("from") >> Exp; | ||
| 188 | 193 | ||
| 189 | import_literal_inner = (range('a', 'z') | range('A', 'Z') | set("_-")) >> *(AlphaNum | '-'); | 194 | import_literal_inner = (range('a', 'z') | range('A', 'Z') | set("_-")) >> *(AlphaNum | '-'); |
| 190 | import_literal_chain = Seperator >> import_literal_inner >> *(expr('.') >> import_literal_inner); | 195 | import_literal_chain = Seperator >> import_literal_inner >> *(expr('.') >> import_literal_inner); |
| 191 | ImportLiteral = sym('\'') >> import_literal_chain >> symx('\'') | sym('"') >> import_literal_chain >> symx('"'); | 196 | ImportLiteral = sym('\'') >> import_literal_chain >> symx('\'') | sym('"') >> import_literal_chain >> symx('"'); |
| 192 | 197 | ||
| 193 | ImportFrom = ImportNameList >> *SpaceBreak >> key("from") >> Exp; | 198 | macro_name_pair = Space >> MacroName >> Space >> symx(':') >> Space >> MacroName; |
| 194 | 199 | import_all_macro = expr('$'); | |
| 195 | EnableMacroPair = pl::user(true_(), [](const item_t& item) { | 200 | ImportTabItem = variable_pair | normal_pair | sym(':') >> MacroName | macro_name_pair | Space >> import_all_macro; |
| 196 | State* st = reinterpret_cast<State*>(item.user_data); | 201 | ImportTabList = ImportTabItem >> *(sym(',') >> ImportTabItem); |
| 197 | st->macroPairEnabled = true; | 202 | ImportTabLine = ( |
| 198 | return true; | 203 | PushIndent >> (ImportTabList >> PopIndent | PopIndent) |
| 199 | }); | 204 | ) | Space; |
| 200 | 205 | import_tab_lines = SpaceBreak >> ImportTabLine >> *(-sym(',') >> SpaceBreak >> ImportTabLine) >> -sym(','); | |
| 201 | DiableMacroPair = pl::user(true_(), [](const item_t& item) { | 206 | ImportTabLit = |
| 202 | State* st = reinterpret_cast<State*>(item.user_data); | 207 | sym('{') >> Seperator >> |
| 203 | st->macroPairEnabled = false; | 208 | -ImportTabList >> |
| 204 | return true; | 209 | -sym(',') >> |
| 205 | }); | 210 | -import_tab_lines >> |
| 211 | White >> sym('}'); | ||
| 206 | 212 | ||
| 207 | ImportAs = ImportLiteral >> -(key("as") >> (Space >> Variable | EnableMacroPair >> ensure(TableLit, DiableMacroPair))); | 213 | ImportAs = ImportLiteral >> -(key("as") >> (Space >> Variable | ImportTabLit)); |
| 208 | 214 | ||
| 209 | Import = key("import") >> (ImportAs | ImportFrom); | 215 | Import = key("import") >> (ImportAs | ImportFrom); |
| 210 | 216 | ||
| @@ -483,12 +489,7 @@ MoonParser::MoonParser() { | |||
| 483 | symx(':') >> | 489 | symx(':') >> |
| 484 | (Exp | TableBlock | +(SpaceBreak) >> Exp); | 490 | (Exp | TableBlock | +(SpaceBreak) >> Exp); |
| 485 | 491 | ||
| 486 | macro_name_pair = Space >> MacroName >> Space >> symx(':') >> Space >> MacroName; | 492 | KeyValue = variable_pair | normal_pair; |
| 487 | |||
| 488 | KeyValue = variable_pair | normal_pair | pl::user(sym(':') >> MacroName | macro_name_pair, [](const item_t& item) { | ||
| 489 | State* st = reinterpret_cast<State*>(item.user_data); | ||
| 490 | return st->macroPairEnabled; | ||
| 491 | }); | ||
| 492 | 493 | ||
| 493 | KeyValueList = KeyValue >> *(sym(',') >> KeyValue); | 494 | KeyValueList = KeyValue >> *(sym(',') >> KeyValue); |
| 494 | KeyValueLine = CheckIndent >> (KeyValueList >> -sym(',') | TableBlockIndent | Space >> expr('*') >> Exp); | 495 | KeyValueLine = CheckIndent >> (KeyValueList >> -sym(',') | TableBlockIndent | Space >> expr('*') >> Exp); |
