aboutsummaryrefslogtreecommitdiff
path: root/src/MoonP/moon_parser.cpp
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2020-10-15 09:38:01 +0800
committerLi Jin <dragon-fly@qq.com>2020-10-15 09:38:01 +0800
commit2a7256ea8cb8a292d8f395c13ed2462df4c084a0 (patch)
tree03600fe01a7b4fd6c49f80eb1e570503bdc5bee4 /src/MoonP/moon_parser.cpp
parentb4687f90305c24149a5d43d84bf64fa192dae8f8 (diff)
downloadyuescript-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.cpp53
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);