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); |