aboutsummaryrefslogtreecommitdiff
path: root/MoonParser/moon_parser.cpp
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2019-09-17 00:41:21 +0800
committerLi Jin <dragon-fly@qq.com>2019-09-17 00:41:21 +0800
commit74c4f6eab47f76b093e17f515204525e00a3b352 (patch)
treed737b1437f103842f30c96a2787468d474405efb /MoonParser/moon_parser.cpp
parentb65798d7960d797f2b7074c4cc47b8c70a9f5270 (diff)
downloadyuescript-74c4f6eab47f76b093e17f515204525e00a3b352.tar.gz
yuescript-74c4f6eab47f76b093e17f515204525e00a3b352.tar.bz2
yuescript-74c4f6eab47f76b093e17f515204525e00a3b352.zip
completing spec/class.moon
Diffstat (limited to 'MoonParser/moon_parser.cpp')
-rw-r--r--MoonParser/moon_parser.cpp94
1 files changed, 40 insertions, 54 deletions
diff --git a/MoonParser/moon_parser.cpp b/MoonParser/moon_parser.cpp
index 3009ee5..ec8df38 100644
--- a/MoonParser/moon_parser.cpp
+++ b/MoonParser/moon_parser.cpp
@@ -20,9 +20,8 @@ rule SomeSpace = +set(" \t") >> -Comment;
20rule SpaceBreak = Space >> Break; 20rule SpaceBreak = Space >> Break;
21rule EmptyLine = SpaceBreak; 21rule EmptyLine = SpaceBreak;
22rule AlphaNum = range('a', 'z') | range('A', 'Z') | range('0', '9') | '_'; 22rule AlphaNum = range('a', 'z') | range('A', 'Z') | range('0', '9') | '_';
23rule _Name = (range('a', 'z') | range('A', 'Z') | '_') >> *AlphaNum; 23rule Name = (range('a', 'z') | range('A', 'Z') | '_') >> *AlphaNum;
24rule SpaceName = Space >> _Name; 24rule Num =
25rule _Num =
26 ( 25 (
27 "0x" >> 26 "0x" >>
28 +(range('0', '9') | range('a', 'f') | range('A', 'F')) >> 27 +(range('0', '9') | range('a', 'f') | range('A', 'F')) >>
@@ -35,7 +34,6 @@ rule _Num =
35 ('.' >> +range('0', '9')) 34 ('.' >> +range('0', '9'))
36 ) >> -(set("eE") >> -expr('-') >> +range('0', '9')) 35 ) >> -(set("eE") >> -expr('-') >> +range('0', '9'))
37 ); 36 );
38rule Num = Space >> _Num;
39rule Cut = false_(); 37rule Cut = false_();
40rule Seperator = true_(); 38rule Seperator = true_();
41 39
@@ -44,8 +42,7 @@ rule Seperator = true_();
44#define ensure(patt, finally) (((patt) >> (finally)) | ((finally) >> (Cut))) 42#define ensure(patt, finally) (((patt) >> (finally)) | ((finally) >> (Cut)))
45#define key(str) (Space >> str >> not_(AlphaNum)) 43#define key(str) (Space >> str >> not_(AlphaNum))
46 44
47rule Name = user(_Name, [](const item_t& item) 45rule Variable = user(Name, [](const item_t& item) {
48{
49 State* st = reinterpret_cast<State*>(item.user_data); 46 State* st = reinterpret_cast<State*>(item.user_data);
50 for (auto it = item.begin; it != item.end; ++it) st->buffer << static_cast<char>(*it); 47 for (auto it = item.begin; it != item.end; ++it) st->buffer << static_cast<char>(*it);
51 std::string name; 48 std::string name;
@@ -57,21 +54,18 @@ rule Name = user(_Name, [](const item_t& item)
57}); 54});
58 55
59rule self = expr('@'); 56rule self = expr('@');
60rule self_name = '@' >> _Name; 57rule self_name = '@' >> Name;
61rule self_class = expr("@@"); 58rule self_class = expr("@@");
62rule self_class_name = "@@" >> _Name; 59rule self_class_name = "@@" >> Name;
63 60
64rule SelfName = Space >> (self_class_name | self_class | self_name | self); 61rule SelfName = Space >> (self_class_name | self_class | self_name | self);
65rule KeyName = SelfName | Space >> _Name; 62rule KeyName = SelfName | Space >> Name;
66rule VarArg = Space >> "..."; 63rule VarArg = Space >> "...";
67 64
68rule check_indent = user(Indent, [](const item_t& item) 65rule check_indent = user(Indent, [](const item_t& item) {
69{
70 int indent = 0; 66 int indent = 0;
71 for (input_it i = item.begin; i != item.end; ++i) 67 for (input_it i = item.begin; i != item.end; ++i) {
72 { 68 switch (*i) {
73 switch (*i)
74 {
75 case ' ': indent++; break; 69 case ' ': indent++; break;
76 case '\t': indent += 4; break; 70 case '\t': indent += 4; break;
77 } 71 }
@@ -81,21 +75,17 @@ rule check_indent = user(Indent, [](const item_t& item)
81}); 75});
82rule CheckIndent = and_(check_indent); 76rule CheckIndent = and_(check_indent);
83 77
84rule advance = user(Indent, [](const item_t& item) 78rule advance = user(Indent, [](const item_t& item) {
85{
86 int indent = 0; 79 int indent = 0;
87 for (input_it i = item.begin; i != item.end; ++i) 80 for (input_it i = item.begin; i != item.end; ++i) {
88 { 81 switch (*i) {
89 switch (*i)
90 {
91 case ' ': indent++; break; 82 case ' ': indent++; break;
92 case '\t': indent += 4; break; 83 case '\t': indent += 4; break;
93 } 84 }
94 } 85 }
95 State* st = reinterpret_cast<State*>(item.user_data); 86 State* st = reinterpret_cast<State*>(item.user_data);
96 int top = st->indents.top(); 87 int top = st->indents.top();
97 if (top != -1 && indent > top) 88 if (top != -1 && indent > top) {
98 {
99 st->indents.push(indent); 89 st->indents.push(indent);
100 return true; 90 return true;
101 } 91 }
@@ -103,13 +93,10 @@ rule advance = user(Indent, [](const item_t& item)
103}); 93});
104rule Advance = and_(advance); 94rule Advance = and_(advance);
105 95
106rule push_indent = user(Indent, [](const item_t& item) 96rule push_indent = user(Indent, [](const item_t& item) {
107{
108 int indent = 0; 97 int indent = 0;
109 for (input_it i = item.begin; i != item.end; ++i) 98 for (input_it i = item.begin; i != item.end; ++i) {
110 { 99 switch (*i) {
111 switch (*i)
112 {
113 case ' ': indent++; break; 100 case ' ': indent++; break;
114 case '\t': indent += 4; break; 101 case '\t': indent += 4; break;
115 } 102 }
@@ -120,15 +107,13 @@ rule push_indent = user(Indent, [](const item_t& item)
120}); 107});
121rule PushIndent = and_(push_indent); 108rule PushIndent = and_(push_indent);
122 109
123rule PreventIndent = user(true_(), [](const item_t& item) 110rule PreventIndent = user(true_(), [](const item_t& item) {
124{
125 State* st = reinterpret_cast<State*>(item.user_data); 111 State* st = reinterpret_cast<State*>(item.user_data);
126 st->indents.push(-1); 112 st->indents.push(-1);
127 return true; 113 return true;
128}); 114});
129 115
130rule PopIndent = user(true_(), [](const item_t& item) 116rule PopIndent = user(true_(), [](const item_t& item) {
131{
132 State* st = reinterpret_cast<State*>(item.user_data); 117 State* st = reinterpret_cast<State*>(item.user_data);
133 st->indents.pop(); 118 st->indents.pop();
134 return true; 119 return true;
@@ -143,8 +128,8 @@ extern rule NameList;
143rule local_flag = expr('*') | expr('^'); 128rule local_flag = expr('*') | expr('^');
144rule Local = key("local") >> ((Space >> local_flag) | NameList); 129rule Local = key("local") >> ((Space >> local_flag) | NameList);
145 130
146rule colon_import_name = sym('\\') >> Space >> Name; 131rule colon_import_name = sym('\\') >> Space >> Variable;
147rule ImportName = colon_import_name | Space >> Name; 132rule ImportName = colon_import_name | Space >> Variable;
148rule ImportNameList = Seperator >> *SpaceBreak >> ImportName >> *((+SpaceBreak | sym(',') >> *SpaceBreak) >> ImportName); 133rule ImportNameList = Seperator >> *SpaceBreak >> ImportName >> *((+SpaceBreak | sym(',') >> *SpaceBreak) >> ImportName);
149 134
150extern rule Exp; 135extern rule Exp;
@@ -183,7 +168,7 @@ rule Unless = key("unless") >> IfCond >> -key("then") >> Body >> Seperator >> *I
183rule While = key("while") >> DisableDo >> ensure(Exp, PopDo) >> -key("do") >> Body; 168rule While = key("while") >> DisableDo >> ensure(Exp, PopDo) >> -key("do") >> Body;
184 169
185rule for_step_value = sym(',') >> Exp; 170rule for_step_value = sym(',') >> Exp;
186rule for_args = Space >> Name >> sym('=') >> Exp >> sym(',') >> Exp >> -for_step_value; 171rule for_args = Space >> Variable >> sym('=') >> Exp >> sym(',') >> Exp >> -for_step_value;
187 172
188rule For = key("for") >> DisableDo >> 173rule For = key("for") >> DisableDo >>
189 ensure(for_args, PopDo) >> 174 ensure(for_args, PopDo) >>
@@ -230,7 +215,7 @@ extern rule CompForEach, CompFor, CompClause;
230rule CompInner = (CompForEach | CompFor) >> Seperator >> *CompClause; 215rule CompInner = (CompForEach | CompFor) >> Seperator >> *CompClause;
231rule star_exp = sym('*') >> Exp; 216rule star_exp = sym('*') >> Exp;
232rule CompForEach = key("for") >> AssignableNameList >> key("in") >> (star_exp | Exp); 217rule CompForEach = key("for") >> AssignableNameList >> key("in") >> (star_exp | Exp);
233rule CompFor = key("for") >> Space >> Name >> sym('=') >> Exp >> sym(',') >> Exp >> -for_step_value; 218rule CompFor = key("for") >> Space >> Variable >> sym('=') >> Exp >> sym(',') >> Exp >> -for_step_value;
234rule CompClause = CompFor | CompForEach | key("when") >> Exp; 219rule CompClause = CompFor | CompForEach | key("when") >> Exp;
235 220
236extern rule TableBlock; 221extern rule TableBlock;
@@ -269,7 +254,7 @@ rule BinaryOperator =
269 254
270extern rule Chain; 255extern rule Chain;
271 256
272rule Assignable = Chain | Space >> Name | SelfName; 257rule Assignable = Chain | Space >> Variable | SelfName;
273 258
274extern rule Value; 259extern rule Value;
275 260
@@ -324,7 +309,7 @@ rule LuaString = user(LuaStringOpen >> -Break >> LuaStringContent >> LuaStringCl
324}); 309});
325 310
326rule Parens = sym('(') >> *SpaceBreak >> Exp >> *SpaceBreak >> sym(')'); 311rule Parens = sym('(') >> *SpaceBreak >> Exp >> *SpaceBreak >> sym(')');
327rule Callable = Space >> Name | SelfName | VarArg | Parens; 312rule Callable = Space >> Variable | SelfName | VarArg | Parens;
328rule FnArgsExpList = Exp >> *((Break | sym(',')) >> White >> Exp); 313rule FnArgsExpList = Exp >> *((Break | sym(',')) >> White >> Exp);
329 314
330rule FnArgs = Seperator >> 315rule FnArgs = Seperator >>
@@ -356,8 +341,8 @@ extern rule Invoke, Slice;
356 341
357rule Index = symx('[') >> Exp >> sym(']'); 342rule Index = symx('[') >> Exp >> sym(']');
358rule ChainItem = Invoke | DotChainItem | Slice | Index; 343rule ChainItem = Invoke | DotChainItem | Slice | Index;
359rule DotChainItem = symx('.') >> _Name; 344rule DotChainItem = symx('.') >> Name;
360rule ColonChainItem = symx('\\') >> _Name; 345rule ColonChainItem = symx('\\') >> Name;
361rule invoke_chain = Invoke >> -ChainItems; 346rule invoke_chain = Invoke >> -ChainItems;
362rule ColonChain = ColonChainItem >> -invoke_chain; 347rule ColonChain = ColonChainItem >> -invoke_chain;
363 348
@@ -406,7 +391,7 @@ rule TableBlock = +(SpaceBreak) >> Advance >> ensure(TableBlockInner, PopIndent)
406extern rule Statement; 391extern rule Statement;
407 392
408rule class_member_list = Seperator >> KeyValue >> *(sym(',') >> KeyValue); 393rule class_member_list = Seperator >> KeyValue >> *(sym(',') >> KeyValue);
409rule ClassLine = CheckIndent >> (class_member_list | Statement | Exp) >> -sym(','); 394rule ClassLine = CheckIndent >> (class_member_list | Statement) >> -sym(',');
410rule ClassBlock = +(SpaceBreak) >> Advance >>Seperator >> ClassLine >> *(+(SpaceBreak) >> ClassLine) >> PopIndent; 395rule ClassBlock = +(SpaceBreak) >> Advance >>Seperator >> ClassLine >> *(+(SpaceBreak) >> ClassLine) >> PopIndent;
411 396
412rule ClassDecl = 397rule ClassDecl =
@@ -419,7 +404,7 @@ rule export_values = NameList >> -(sym('=') >> ExpListLow);
419rule export_op = expr('*') | expr('^'); 404rule export_op = expr('*') | expr('^');
420rule Export = key("export") >> (ClassDecl | (Space >> export_op) | export_values); 405rule Export = key("export") >> (ClassDecl | (Space >> export_op) | export_values);
421 406
422rule variable_pair = sym(':') >> not_(SomeSpace) >> Space >> Name; 407rule variable_pair = sym(':') >> not_(SomeSpace) >> Space >> Variable;
423 408
424rule normal_pair = 409rule normal_pair =
425( 410(
@@ -436,7 +421,7 @@ rule KeyValue = variable_pair | normal_pair;
436rule KeyValueList = KeyValue >> *(sym(',') >> KeyValue); 421rule KeyValueList = KeyValue >> *(sym(',') >> KeyValue);
437rule KeyValueLine = CheckIndent >> KeyValueList >> -sym(','); 422rule KeyValueLine = CheckIndent >> KeyValueList >> -sym(',');
438 423
439rule FnArgDef = (Space >> Name | SelfName) >> -(sym('=') >> Exp); 424rule FnArgDef = (Space >> Variable | SelfName) >> -(sym('=') >> Exp);
440 425
441rule FnArgDefList = Seperator >> 426rule FnArgDefList = Seperator >>
442( 427(
@@ -455,8 +440,8 @@ rule FnArgsDef = sym('(') >> White >> -FnArgDefList >> -outer_var_shadow >> Whit
455rule fn_arrow = expr("->") | expr("=>"); 440rule fn_arrow = expr("->") | expr("=>");
456rule FunLit = -FnArgsDef >> Space >> fn_arrow >> -Body; 441rule FunLit = -FnArgsDef >> Space >> fn_arrow >> -Body;
457 442
458rule NameList = Seperator >> Space >> Name >> *(sym(',') >> Space >> Name); 443rule NameList = Seperator >> Space >> Variable >> *(sym(',') >> Space >> Variable);
459rule NameOrDestructure = Space >> Name | TableLit; 444rule NameOrDestructure = Space >> Variable | TableLit;
460rule AssignableNameList = Seperator >> NameOrDestructure >> *(sym(',') >> NameOrDestructure); 445rule AssignableNameList = Seperator >> NameOrDestructure >> *(sym(',') >> NameOrDestructure);
461 446
462rule ExpList = Seperator >> Exp >> *(sym(',') >> Exp); 447rule ExpList = Seperator >> Exp >> *(sym(',') >> Exp);
@@ -479,18 +464,19 @@ rule InvokeArgs =
479 TableBlock 464 TableBlock
480 ); 465 );
481 466
482rule const_value = key("nil") | key("true") | key("false"); 467rule const_value = (expr("nil") | expr("true") | expr("false")) >> not_(AlphaNum);
483rule minus_exp = sym('-') >> not_(SomeSpace) >> Exp; 468rule minus_exp = expr('-') >> not_(SomeSpace) >> Exp;
484rule sharp_exp = sym('#') >> Exp; 469rule sharp_exp = expr('#') >> Exp;
485rule tilde_exp = sym('~') >> Exp; 470rule tilde_exp = expr('~') >> Exp;
486rule not_exp = key("not") >> Exp; 471rule not_exp = expr("not") >> not_(AlphaNum) >> Exp;
487rule unary_exp = minus_exp | sharp_exp | tilde_exp | not_exp; 472rule unary_exp = minus_exp | sharp_exp | tilde_exp | not_exp;
488 473
489rule SimpleValue = 474rule SimpleValue =
490 const_value | 475 (Space >> const_value) |
491 If | Unless | Switch | With | ClassDecl | ForEach | For | While | Do | 476 If | Unless | Switch | With | ClassDecl | ForEach | For | While | Do |
492 unary_exp | 477 (Space >> unary_exp) |
493 TblComprehension | TableLit | Comprehension | FunLit | Num; 478 TblComprehension | TableLit | Comprehension | FunLit |
479 (Space >> Num);
494 480
495rule Assignment = ExpList >> (Update | Assign); 481rule Assignment = ExpList >> (Update | Assign);
496 482