aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2023-01-18 15:40:17 +0800
committerLi Jin <dragon-fly@qq.com>2023-01-18 15:40:17 +0800
commit9a31f590ed1557aa180d28c5ab843c39608d0a0a (patch)
treeafdf0144f3371a03fcd441ada15b53a4786a42ab
parent395d5bac06bba03a863c1bb18464fad8a84cd384 (diff)
downloadyuescript-9a31f590ed1557aa180d28c5ab843c39608d0a0a.tar.gz
yuescript-9a31f590ed1557aa180d28c5ab843c39608d0a0a.tar.bz2
yuescript-9a31f590ed1557aa180d28c5ab843c39608d0a0a.zip
clean up syntax.
-rw-r--r--src/yuescript/yue_parser.cpp451
1 files changed, 224 insertions, 227 deletions
diff --git a/src/yuescript/yue_parser.cpp b/src/yuescript/yue_parser.cpp
index 821385b..48308a6 100644
--- a/src/yuescript/yue_parser.cpp
+++ b/src/yuescript/yue_parser.cpp
@@ -38,42 +38,42 @@ YueParser::YueParser() {
38 Stop = Break | eof(); 38 Stop = Break | eof();
39 Indent = plain_space; 39 Indent = plain_space;
40 Comment = "--" >> *(not_(set("\r\n")) >> Any) >> and_(Stop); 40 Comment = "--" >> *(not_(set("\r\n")) >> Any) >> and_(Stop);
41 multi_line_open = expr("--[["); 41 multi_line_open = "--[[";
42 multi_line_close = expr("]]"); 42 multi_line_close = "]]";
43 multi_line_content = *(not_(multi_line_close) >> Any); 43 multi_line_content = *(not_(multi_line_close) >> Any);
44 MultiLineComment = multi_line_open >> multi_line_content >> multi_line_close; 44 MultiLineComment = multi_line_open >> multi_line_content >> multi_line_close;
45 EscapeNewLine = expr('\\') >> *(set(" \t") | MultiLineComment) >> -Comment >> Break; 45 EscapeNewLine = '\\' >> *(set(" \t") | MultiLineComment) >> -Comment >> Break;
46 space_one = set(" \t") | and_(set("-\\")) >> (MultiLineComment | EscapeNewLine); 46 space_one = set(" \t") | and_(set("-\\")) >> (MultiLineComment | EscapeNewLine);
47 Space = -(and_(set(" \t-\\")) >> *space_one >> -Comment); 47 Space = -(and_(set(" \t-\\")) >> *space_one >> -Comment);
48 SpaceBreak = Space >> Break; 48 SpaceBreak = Space >> Break;
49 White = Space >> *(Break >> Space); 49 White = Space >> *(Break >> Space);
50 EmptyLine = SpaceBreak; 50 EmptyLine = SpaceBreak;
51 AlphaNum = sel({range('a', 'z'), range('A', 'Z'), range('0', '9'), expr('_')}); 51 AlphaNum = sel({range('a', 'z'), range('A', 'Z'), range('0', '9'), '_'});
52 Name = sel({range('a', 'z'), range('A', 'Z'), expr('_')}) >> *AlphaNum; 52 Name = sel({range('a', 'z'), range('A', 'Z'), '_'}) >> *AlphaNum;
53 num_expo = set("eE") >> -set("+-") >> num_char; 53 num_expo = set("eE") >> -set("+-") >> num_char;
54 num_expo_hex = set("pP") >> -set("+-") >> num_char; 54 num_expo_hex = set("pP") >> -set("+-") >> num_char;
55 lj_num = -set("uU") >> set("lL") >> set("lL"); 55 lj_num = -set("uU") >> set("lL") >> set("lL");
56 num_char = range('0', '9') >> *(range('0', '9') | expr('_') >> and_(range('0', '9'))); 56 num_char = range('0', '9') >> *(range('0', '9') | '_' >> and_(range('0', '9')));
57 num_char_hex = sel({range('0', '9'), range('a', 'f'), range('A', 'F')}); 57 num_char_hex = sel({range('0', '9'), range('a', 'f'), range('A', 'F')});
58 num_lit = num_char_hex >> *(num_char_hex | expr('_') >> and_(num_char_hex)); 58 num_lit = num_char_hex >> *(num_char_hex | '_' >> and_(num_char_hex));
59 Num = sel({ 59 Num = sel({
60 expr("0x") >> ( 60 "0x" >> (
61 +num_lit >> sel({ 61 +num_lit >> sel({
62 seq({expr('.'), +num_lit, -num_expo_hex}), 62 seq({'.', +num_lit, -num_expo_hex}),
63 num_expo_hex, 63 num_expo_hex,
64 lj_num, 64 lj_num,
65 true_() 65 true_()
66 }) | seq({ 66 }) | seq({
67 expr('.'), +num_lit, -num_expo_hex 67 '.', +num_lit, -num_expo_hex
68 }) 68 })
69 ), 69 ),
70 +num_char >> sel({ 70 +num_char >> sel({
71 seq({expr('.'), +num_char, -num_expo}), 71 seq({'.', +num_char, -num_expo}),
72 num_expo, 72 num_expo,
73 lj_num, 73 lj_num,
74 true_() 74 true_()
75 }), 75 }),
76 seq({expr('.'), +num_char, -num_expo}) 76 seq({'.', +num_char, -num_expo})
77 }); 77 });
78 78
79 Cut = false_(); 79 Cut = false_();
@@ -90,9 +90,9 @@ YueParser::YueParser() {
90 #define disable_chain(patt) (DisableChain >> ((patt) >> EnableChain | EnableChain >> Cut)) 90 #define disable_chain(patt) (DisableChain >> ((patt) >> EnableChain | EnableChain >> Cut))
91 #define disable_do_chain_arg_table_block(patt) (DisableDoChainArgTableBlock >> ((patt) >> EnableDoChainArgTableBlock | EnableDoChainArgTableBlock >> Cut)) 91 #define disable_do_chain_arg_table_block(patt) (DisableDoChainArgTableBlock >> ((patt) >> EnableDoChainArgTableBlock | EnableDoChainArgTableBlock >> Cut))
92 #define disable_arg_table_block(patt) (DisableArgTableBlock >> ((patt) >> EnableArgTableBlock | EnableArgTableBlock >> Cut)) 92 #define disable_arg_table_block(patt) (DisableArgTableBlock >> ((patt) >> EnableArgTableBlock | EnableArgTableBlock >> Cut))
93 #define body_with(str) (Space >> sel({key(str) >> Space >> (InBlock | Statement), InBlock, empty_block_error})) 93 #define body_with(str) (sel({key(str) >> Space >> (InBlock | Statement), InBlock, empty_block_error}))
94 #define opt_body_with(str) (Space >> (key(str) >> Space >> (InBlock | Statement) | InBlock)) 94 #define opt_body_with(str) (key(str) >> Space >> (InBlock | Statement) | InBlock)
95 #define body (Space >> sel({InBlock, Statement, empty_block_error})) 95 #define body (sel({InBlock, Statement, empty_block_error}))
96 96
97 Variable = pl::user(Name, [](const item_t& item) { 97 Variable = pl::user(Name, [](const item_t& item) {
98 State* st = reinterpret_cast<State*>(item.user_data); 98 State* st = reinterpret_cast<State*>(item.user_data);
@@ -124,14 +124,14 @@ YueParser::YueParser() {
124 return it != LuaKeywords.end(); 124 return it != LuaKeywords.end();
125 }); 125 });
126 126
127 self = expr('@'); 127 self = '@';
128 self_name = '@' >> Name; 128 self_name = '@' >> Name;
129 self_class = expr("@@"); 129 self_class = "@@";
130 self_class_name = "@@" >> Name; 130 self_class_name = "@@" >> Name;
131 131
132 SelfName = sel({self_class_name, self_class, self_name, self}); 132 SelfName = sel({self_class_name, self_class, self_name, self});
133 KeyName = SelfName | Name; 133 KeyName = SelfName | Name;
134 VarArg = expr("..."); 134 VarArg = "...";
135 135
136 check_indent = pl::user(Indent, [](const item_t& item) { 136 check_indent = pl::user(Indent, [](const item_t& item) {
137 int indent = 0; 137 int indent = 0;
@@ -190,122 +190,124 @@ YueParser::YueParser() {
190 return true; 190 return true;
191 }); 191 });
192 192
193 InBlock = Space >> +(plain_space >> Break) >> Advance >> ensure(Block, PopIndent); 193 InBlock = +SpaceBreak >> Advance >> ensure(Block, PopIndent);
194 194
195 local_flag = expr('*') | expr('^'); 195 local_flag = sel({'*', '^'});
196 local_values = NameList >> -(Space >> expr('=') >> (TableBlock | ExpListLow)); 196 local_values = NameList >> -(Space >> '=' >> Space >> (TableBlock | ExpListLow));
197 Local = key("local") >> (Space >> local_flag | local_values); 197 Local = key("local") >> Space >> (local_flag | local_values);
198 198
199 const_attrib = key("const"); 199 const_attrib = key("const");
200 close_attrib = key("close"); 200 close_attrib = key("close");
201 local_const_item = sel({Space >> Variable, simple_table, TableLit}); 201 local_const_item = sel({Variable, simple_table, TableLit});
202 LocalAttrib = ( 202 LocalAttrib = (
203 const_attrib >> Seperator >> local_const_item >> *(Space >> expr(',') >> local_const_item) | 203 const_attrib >> Seperator >> Space >> local_const_item >> *(Space >> ',' >> Space >> local_const_item) |
204 close_attrib >> Seperator >> Space >> Variable >> *(Space >> expr(',') >> Space >> Variable) 204 close_attrib >> Seperator >> Space >> Variable >> *(Space >> ',' >> Space >> Variable)
205 ) >> Assign; 205 ) >> Space >> Assign;
206 206
207 colon_import_name = Space >> expr('\\') >> Space >> Variable; 207 colon_import_name = '\\' >> Space >> Variable;
208 ImportName = colon_import_name | Space >> Variable; 208 ImportName = colon_import_name | Variable;
209 ImportNameList = Seperator >> *SpaceBreak >> ImportName >> *((+SpaceBreak | Space >> expr(',') >> *SpaceBreak) >> ImportName); 209 ImportNameList = Seperator >> *SpaceBreak >> Space >> ImportName >> *((+SpaceBreak | Space >> ',' >> *SpaceBreak) >> Space >> ImportName);
210 ImportFrom = ImportNameList >> *SpaceBreak >> Space >> key("from") >> Exp; 210 ImportFrom = ImportNameList >> *SpaceBreak >> Space >> key("from") >> Space >> Exp;
211 211
212 import_literal_inner = (range('a', 'z') | range('A', 'Z') | set("_-")) >> *(AlphaNum | '-'); 212 import_literal_inner = sel({range('a', 'z'), range('A', 'Z'), set("_-")}) >> *(AlphaNum | '-');
213 import_literal_chain = Seperator >> import_literal_inner >> *(expr('.') >> import_literal_inner); 213 import_literal_chain = Seperator >> import_literal_inner >> *('.' >> import_literal_inner);
214 ImportLiteral = Space >> expr('\'') >> import_literal_chain >> expr('\'') | Space >> expr('"') >> import_literal_chain >> expr('"'); 214 ImportLiteral = sel({
215 '\'' >> import_literal_chain >> '\'',
216 '"' >> import_literal_chain >> '"'
217 });
215 218
216 macro_name_pair = Space >> MacroName >> Space >> expr(':') >> Space >> MacroName; 219 macro_name_pair = MacroName >> ':' >> Space >> MacroName;
217 import_all_macro = expr('$'); 220 import_all_macro = '$';
218 ImportTabItem = sel({ 221 ImportTabItem = sel({
219 variable_pair, 222 variable_pair,
220 normal_pair, 223 normal_pair,
221 Space >> expr(':') >> MacroName, 224 ':' >> MacroName,
222 macro_name_pair, 225 macro_name_pair,
223 Space >> import_all_macro, 226 import_all_macro,
224 meta_variable_pair, 227 meta_variable_pair,
225 meta_normal_pair, 228 meta_normal_pair,
226 Exp 229 Exp
227 }); 230 });
228 ImportTabList = ImportTabItem >> *(Space >> expr(',') >> ImportTabItem); 231 ImportTabList = ImportTabItem >> *(Space >> ',' >> Space >> ImportTabItem);
229 ImportTabLine = ( 232 ImportTabLine = (
230 PushIndent >> (ImportTabList >> PopIndent | PopIndent) 233 PushIndent >> (Space >> ImportTabList >> PopIndent | PopIndent)
231 ) | Space; 234 ) | Space;
232 import_tab_lines = SpaceBreak >> ImportTabLine >> *(-(Space >> expr(',')) >> SpaceBreak >> ImportTabLine) >> -(Space >> expr(',')); 235 import_tab_lines = SpaceBreak >> ImportTabLine >> *(-(Space >> ',') >> SpaceBreak >> ImportTabLine) >> -(Space >> ',');
233 ImportTabLit = seq({ 236 ImportTabLit = seq({
234 Seperator, 237 '{', Seperator,
235 Space, expr('{'), 238 -(Space >> ImportTabList),
236 -ImportTabList, 239 -(Space >> ','),
237 -(Space >> expr(',')),
238 -import_tab_lines, 240 -import_tab_lines,
239 White, 241 White,
240 expr('}') 242 '}'
241 }) | seq({ 243 }) | seq({
242 Seperator, KeyValue, *(Space >> expr(',') >> KeyValue) 244 Seperator, KeyValue, *(Space >> ',' >> Space >> KeyValue)
243 }); 245 });
244 246
245 ImportAs = ImportLiteral >> -(Space >> key("as") >> Space >> (ImportTabLit | Variable | import_all_macro)); 247 ImportAs = ImportLiteral >> -(Space >> key("as") >> Space >> sel({ImportTabLit, Variable, import_all_macro}));
246 248
247 Import = key("import") >> (ImportAs | ImportFrom); 249 Import = key("import") >> Space >> (ImportAs | ImportFrom);
248 250
249 Label = expr("::") >> LabelName >> expr("::"); 251 Label = "::" >> LabelName >> "::";
250 252
251 Goto = key("goto") >> Space >> LabelName; 253 Goto = key("goto") >> Space >> LabelName;
252 254
253 ShortTabAppending = expr("[]") >> Assign; 255 ShortTabAppending = "[]" >> Space >> Assign;
254 256
255 BreakLoop = (expr("break") | expr("continue")) >> not_(AlphaNum); 257 BreakLoop = sel({"break", "continue"}) >> not_(AlphaNum);
256 258
257 Return = key("return") >> -(TableBlock | ExpListLow); 259 Return = key("return") >> -(Space >> (TableBlock | ExpListLow));
258 260
259 WithExp = ExpList >> -Assign; 261 WithExp = ExpList >> -(Space >> Assign);
260 262
261 With = Space >> key("with") >> -existential_op >> disable_do_chain_arg_table_block(WithExp) >> body_with("do"); 263 With = key("with") >> -existential_op >> Space >> disable_do_chain_arg_table_block(WithExp) >> Space >> body_with("do");
262 SwitchCase = Space >> key("when") >> disable_chain(disable_arg_table_block(SwitchList)) >> body_with("then"); 264 SwitchCase = key("when") >> disable_chain(disable_arg_table_block(SwitchList)) >> Space >> body_with("then");
263 SwitchElse = Space >> key("else") >> body; 265 SwitchElse = key("else") >> Space >> body;
264 266
265 SwitchBlock = 267 SwitchBlock =
266 *(Break >> *EmptyLine >> CheckIndent >> SwitchCase) >> 268 *(Break >> *EmptyLine >> CheckIndent >> Space >> SwitchCase) >>
267 -(Break >> *EmptyLine >> CheckIndent >> SwitchElse); 269 -(Break >> *EmptyLine >> CheckIndent >> Space >> SwitchElse);
268 270
269 exp_not_tab = not_(simple_table | TableLit) >> Exp; 271 exp_not_tab = not_(simple_table | TableLit) >> Space >> Exp;
270 272
271 SwitchList = Seperator >> ( 273 SwitchList = Seperator >> (
272 and_(simple_table | TableLit) >> Exp | 274 and_(simple_table | TableLit) >> Space >> Exp |
273 exp_not_tab >> *(Space >> expr(',') >> exp_not_tab) 275 exp_not_tab >> *(Space >> ',' >> exp_not_tab)
274 ); 276 );
275 Switch = Space >> key("switch") >> Exp >> 277 Switch = key("switch") >> Space >> Exp >>
276 Seperator >> ( 278 Space >> Seperator >> (
277 SwitchCase >> Space >> ( 279 SwitchCase >> Space >> (
278 Break >> *EmptyLine >> CheckIndent >> SwitchCase >> SwitchBlock | 280 Break >> *EmptyLine >> CheckIndent >> Space >> SwitchCase >> SwitchBlock |
279 *SwitchCase >> -SwitchElse 281 *(Space >> SwitchCase) >> -(Space >> SwitchElse)
280 ) | 282 ) |
281 SpaceBreak >> *EmptyLine >> Advance >> SwitchCase >> SwitchBlock >> PopIndent 283 SpaceBreak >> *EmptyLine >> Advance >> Space >> SwitchCase >> SwitchBlock >> PopIndent
282 ) >> SwitchBlock; 284 ) >> SwitchBlock;
283 285
284 assignment = ExpList >> Assign; 286 assignment = ExpList >> Space >> Assign;
285 IfCond = disable_chain(disable_arg_table_block(assignment | Exp)); 287 IfCond = disable_chain(disable_arg_table_block(assignment | Exp));
286 IfElseIf = -(Break >> *EmptyLine >> CheckIndent) >> Space >> key("elseif") >> IfCond >> body_with("then"); 288 IfElseIf = -(Break >> *EmptyLine >> CheckIndent) >> Space >> key("elseif") >> Space >> IfCond >> Space >> body_with("then");
287 IfElse = -(Break >> *EmptyLine >> CheckIndent) >> Space >> key("else") >> body; 289 IfElse = -(Break >> *EmptyLine >> CheckIndent) >> Space >> key("else") >> Space >> body;
288 IfType = (expr("if") | expr("unless")) >> not_(AlphaNum); 290 IfType = sel({"if", "unless"}) >> not_(AlphaNum);
289 If = seq({Space, IfType, IfCond, opt_body_with("then"), *IfElseIf, -IfElse}); 291 If = seq({IfType, Space, IfCond, Space, opt_body_with("then"), *IfElseIf, -IfElse});
290 292
291 WhileType = (expr("while") | expr("until")) >> not_(AlphaNum); 293 WhileType = sel({"while", "until"}) >> not_(AlphaNum);
292 While = WhileType >> disable_do_chain_arg_table_block(Exp) >> opt_body_with("do"); 294 While = WhileType >> Space >> disable_do_chain_arg_table_block(Exp) >> Space >> opt_body_with("do");
293 Repeat = seq({key("repeat"), Body, Break, *EmptyLine, CheckIndent, Space, key("until"), Exp}); 295 Repeat = seq({key("repeat"), Space, Body, Break, *EmptyLine, CheckIndent, Space, key("until"), Space, Exp});
294 296
295 for_step_value = Space >> expr(',') >> Exp; 297 for_step_value = ',' >> Space >> Exp;
296 for_args = Space >> Variable >> Space >> expr('=') >> Exp >> Space >> expr(',') >> Exp >> -for_step_value; 298 for_args = Variable >> Space >> '=' >> Space >> Exp >> Space >> ',' >> Space >> Exp >> Space >> -for_step_value;
297 299
298 For = key("for") >> disable_do_chain_arg_table_block(for_args) >> opt_body_with("do"); 300 For = key("for") >> Space >> disable_do_chain_arg_table_block(for_args) >> Space >> opt_body_with("do");
299 301
300 for_in = star_exp | ExpList; 302 for_in = star_exp | ExpList;
301 303
302 ForEach = key("for") >> AssignableNameList >> Space >> key("in") >> 304 ForEach = key("for") >> Space >> AssignableNameList >> Space >> key("in") >> Space >>
303 disable_do_chain_arg_table_block(for_in) >> opt_body_with("do"); 305 disable_do_chain_arg_table_block(for_in) >> Space >> opt_body_with("do");
304 306
305 Do = pl::user(Space >> key("do"), [](const item_t& item) { 307 Do = pl::user(key("do"), [](const item_t& item) {
306 State* st = reinterpret_cast<State*>(item.user_data); 308 State* st = reinterpret_cast<State*>(item.user_data);
307 return st->noDoStack.empty() || !st->noDoStack.top(); 309 return st->noDoStack.empty() || !st->noDoStack.top();
308 }) >> Body; 310 }) >> Space >> Body;
309 311
310 DisableDo = pl::user(true_(), [](const item_t& item) { 312 DisableDo = pl::user(true_(), [](const item_t& item) {
311 State* st = reinterpret_cast<State*>(item.user_data); 313 State* st = reinterpret_cast<State*>(item.user_data);
@@ -347,73 +349,61 @@ YueParser::YueParser() {
347 return true; 349 return true;
348 }); 350 });
349 351
350 catch_block = Break >> *EmptyLine >> CheckIndent >> Space >> key("catch") >> Space >> Variable >> InBlock; 352 catch_block = Break >> *EmptyLine >> CheckIndent >> Space >> key("catch") >> Space >> Variable >> Space >> InBlock;
351 Try = Space >> key("try") >> (InBlock | Exp) >> -catch_block; 353 Try = key("try") >> Space >> (InBlock | Exp) >> -catch_block;
352 354
353 Comprehension = Space >> expr('[') >> not_('[') >> Exp >> Space >> CompInner >> Space >> expr(']'); 355 Comprehension = '[' >> not_('[') >> Space >> Exp >> Space >> CompInner >> Space >> ']';
354 comp_value = Space >> expr(',') >> Exp; 356 comp_value = ',' >> Space >> Exp;
355 TblComprehension = Space >> expr('{') >> Exp >> -comp_value >> Space >> CompInner >> Space >> expr('}'); 357 TblComprehension = '{' >> Space >> Exp >> Space >> -(comp_value >> Space) >> CompInner >> Space >> '}';
356 358
357 CompInner = Seperator >> (CompForEach | CompFor) >> *CompClause; 359 CompInner = Seperator >> (CompForEach | CompFor) >> *(Space >> CompClause);
358 star_exp = Space >> expr('*') >> Exp; 360 star_exp = '*' >> Space >> Exp;
359 CompForEach = key("for") >> AssignableNameList >> Space >> key("in") >> (star_exp | Exp); 361 CompForEach = key("for") >> Space >> AssignableNameList >> Space >> key("in") >> Space >> (star_exp | Exp);
360 CompFor = key("for") >> Space >> Variable >> Space >> expr('=') >> Exp >> Space >> expr(',') >> Exp >> -for_step_value; 362 CompFor = key("for") >> Space >> Variable >> Space >> '=' >> Space >> Exp >> Space >> ',' >> Space >> Exp >> -for_step_value;
361 CompClause = Space >> sel({CompFor, CompForEach, key("when") >> Exp}); 363 CompClause = sel({CompFor, CompForEach, key("when") >> Space >> Exp});
362 364
363 Assign = Space >> expr('=') >> Seperator >> sel({ 365 Assign = '=' >> Space >> Seperator >> sel({
364 With, If, Switch, TableBlock, 366 With, If, Switch, TableBlock,
365 Exp >> *(Space >> set(",;") >> Exp) 367 Exp >> *(Space >> set(",;") >> Space >> Exp)
366 }); 368 });
367 369
368 update_op = sel({ 370 update_op = sel({
369 expr(".."), 371 "..", "//", "or", "and",
370 expr("//"), 372 ">>", "<<", "??",
371 expr("or"),
372 expr("and"),
373 expr(">>"),
374 expr("<<"),
375 expr("??"),
376 set("+-*/%&|") 373 set("+-*/%&|")
377 }); 374 });
378 375
379 Update = Space >> update_op >> expr("=") >> Exp; 376 Update = update_op >> '=' >> Space >> Exp;
380 377
381 Assignable = Space >> sel({AssignableChain, Variable, SelfName}); 378 Assignable = sel({AssignableChain, Variable, SelfName});
382 379
383 unary_value = +(unary_operator >> Space) >> Value; 380 unary_value = +(unary_operator >> Space) >> Value;
384 381
385 ExponentialOperator = expr('^'); 382 ExponentialOperator = '^';
386 expo_value = seq({Space, ExponentialOperator, *SpaceBreak, Space, Value}); 383 expo_value = seq({ExponentialOperator, *SpaceBreak, Space, Value});
387 expo_exp = Value >> *expo_value; 384 expo_exp = Value >> *(Space >> expo_value);
388 385
389 unary_operator = sel({ 386 unary_operator = sel({
390 expr('-') >> not_(set(">=") | space_one), 387 '-' >> not_(set(">=") | space_one),
391 expr('#'), 388 '#',
392 expr('~') >> not_(expr('=') | space_one), 389 '~' >> not_('=' | space_one),
393 expr("not") >> not_(AlphaNum) 390 "not" >> not_(AlphaNum)
394 }); 391 });
395 unary_exp = Space >> *(unary_operator >> Space) >> expo_exp; 392 unary_exp = *(unary_operator >> Space) >> expo_exp;
396 393
397 PipeOperator = expr("|>"); 394 PipeOperator = "|>";
398 pipe_value = seq({Space, PipeOperator, *SpaceBreak, unary_exp}); 395 pipe_value = seq({PipeOperator, *SpaceBreak, Space, unary_exp});
399 pipe_exp = unary_exp >> *pipe_value; 396 pipe_exp = unary_exp >> *(Space >> pipe_value);
400 397
401 BinaryOperator = sel({ 398 BinaryOperator = sel({
402 (expr("or") >> not_(AlphaNum)), 399 "or" >> not_(AlphaNum),
403 (expr("and") >> not_(AlphaNum)), 400 "and" >> not_(AlphaNum),
404 expr("<="), 401 "<=", ">=", "~=", "!=", "==",
405 expr(">="), 402 "..", "<<", ">>", "//",
406 expr("~="),
407 expr("!="),
408 expr("=="),
409 expr(".."),
410 expr("<<"),
411 expr(">>"),
412 expr("//"),
413 set("+-*/%><|&~") 403 set("+-*/%><|&~")
414 }); 404 });
415 exp_op_value = seq({Space, BinaryOperator, *SpaceBreak, pipe_exp}); 405 exp_op_value = seq({BinaryOperator, *SpaceBreak, Space, pipe_exp});
416 Exp = seq({Seperator, pipe_exp, *exp_op_value, -(Space >> expr("??") >> Exp)}); 406 Exp = seq({Seperator, pipe_exp, *(Space >> exp_op_value), -(Space >> "??" >> Space >> Exp)});
417 407
418 DisableChain = pl::user(true_(), [](const item_t& item) { 408 DisableChain = pl::user(true_(), [](const item_t& item) {
419 State* st = reinterpret_cast<State*>(item.user_data); 409 State* st = reinterpret_cast<State*>(item.user_data);
@@ -441,17 +431,17 @@ YueParser::YueParser() {
441 -table_appending_op 431 -table_appending_op
442 }); 432 });
443 433
444 simple_table = seq({Seperator, KeyValue, *(Space >> expr(',') >> KeyValue)}); 434 simple_table = seq({Seperator, KeyValue, *(Space >> ',' >> Space >> KeyValue)});
445 Value = sel({SimpleValue, simple_table, ChainValue, String}); 435 Value = sel({SimpleValue, simple_table, ChainValue, String});
446 436
447 single_string_inner = expr('\\') >> set("'\\") | not_(expr('\'')) >> Any; 437 single_string_inner = '\\' >> set("'\\") | not_('\'') >> Any;
448 SingleString = expr('\'') >> *single_string_inner >> expr('\''); 438 SingleString = '\'' >> *single_string_inner >> '\'';
449 interp = expr("#{") >> Exp >> Space >> expr('}'); 439 interp = "#{" >> Space >> Exp >> Space >> '}';
450 double_string_plain = expr('\\') >> set("\"\\") | not_(expr('"')) >> Any; 440 double_string_plain = '\\' >> set("\"\\") | not_('"') >> Any;
451 double_string_inner = +(not_(interp) >> double_string_plain); 441 double_string_inner = +(not_(interp) >> double_string_plain);
452 double_string_content = double_string_inner | interp; 442 double_string_content = double_string_inner | interp;
453 DoubleString = expr('"') >> Seperator >> *double_string_content >> expr('"'); 443 DoubleString = '"' >> Seperator >> *double_string_content >> '"';
454 String = DoubleString | SingleString | LuaString; 444 String = sel({DoubleString, SingleString, LuaString});
455 445
456 lua_string_open = '[' >> *expr('=') >> '['; 446 lua_string_open = '[' >> *expr('=') >> '[';
457 lua_string_close = ']' >> *expr('=') >> ']'; 447 lua_string_close = ']' >> *expr('=') >> ']';
@@ -473,21 +463,21 @@ YueParser::YueParser() {
473 463
474 LuaString = LuaStringOpen >> -Break >> LuaStringContent >> LuaStringClose; 464 LuaString = LuaStringOpen >> -Break >> LuaStringContent >> LuaStringClose;
475 465
476 Parens = pl::user(seq({expr('('), *SpaceBreak, Exp, *SpaceBreak, Space >> expr(')')}), [](const item_t&) { 466 Parens = seq({'(', *SpaceBreak, Space, Exp, *SpaceBreak, Space, ')'});
477 return true;
478 });
479 Callable = sel({Variable, SelfName, MacroName, VarArg, Parens}); 467 Callable = sel({Variable, SelfName, MacroName, VarArg, Parens});
480 FnArgsExpList = Exp >> *seq({Break | Space >> expr(','), White, Exp}); 468 FnArgsExpList = Space >> Exp >> Space >> *seq({Break | ',', White, Exp});
481 469
482 FnArgs = seq({expr('('), *SpaceBreak, -FnArgsExpList, *SpaceBreak, Space, expr(')')}) | 470 FnArgs = sel({
483 seq({Space, expr('!'), not_(expr('='))}); 471 seq({'(', *SpaceBreak, -FnArgsExpList, *SpaceBreak, Space, ')'}),
472 seq({Space, '!', not_('=')})
473 });
484 474
485 meta_index = sel({Name, Index, String}); 475 meta_index = sel({Name, Index, String});
486 Metatable = expr('<') >> Space >> expr('>'); 476 Metatable = '<' >> Space >> '>';
487 Metamethod = expr('<') >> Space >> meta_index >> Space >> expr('>'); 477 Metamethod = '<' >> Space >> meta_index >> Space >> '>';
488 478
489 existential_op = expr('?') >> not_(expr('?')); 479 existential_op = '?' >> not_('?');
490 table_appending_op = expr("[]"); 480 table_appending_op = "[]";
491 chain_call = seq({ 481 chain_call = seq({
492 Callable, 482 Callable,
493 -existential_op, 483 -existential_op,
@@ -516,37 +506,37 @@ YueParser::YueParser() {
516 chain_with_colon = +ChainItem >> -ColonChain; 506 chain_with_colon = +ChainItem >> -ColonChain;
517 ChainItems = chain_with_colon | ColonChain; 507 ChainItems = chain_with_colon | ColonChain;
518 508
519 Index = seq({expr('['), not_('['), Exp, Space, expr(']')}); 509 Index = seq({'[', not_('['), Space, Exp, Space, ']'});
520 ChainItem = sel({ 510 ChainItem = sel({
521 Invoke >> -existential_op, 511 Invoke >> -existential_op,
522 DotChainItem >> -existential_op, 512 DotChainItem >> -existential_op,
523 Slice, 513 Slice,
524 Index >> -existential_op 514 Index >> -existential_op
525 }); 515 });
526 DotChainItem = expr('.') >> sel({Name, Metatable, Metamethod}); 516 DotChainItem = '.' >> sel({Name, Metatable, Metamethod});
527 ColonChainItem = (expr('\\') | expr("::")) >> sel({LuaKeyword, Name, Metamethod}); 517 ColonChainItem = sel({'\\', "::"}) >> sel({LuaKeyword, Name, Metamethod});
528 invoke_chain = Invoke >> -existential_op >> -ChainItems; 518 invoke_chain = Invoke >> -existential_op >> -ChainItems;
529 ColonChain = ColonChainItem >> -existential_op >> -invoke_chain; 519 ColonChain = ColonChainItem >> -existential_op >> -invoke_chain;
530 520
531 default_value = true_(); 521 default_value = true_();
532 Slice = seq({ 522 Slice = seq({
533 expr('['), not_('['), 523 '[', not_('['),
534 Exp | default_value, 524 Space, Exp | default_value,
535 Space, expr(','), 525 Space, ',',
536 Exp | default_value, 526 Space, Exp | default_value,
537 Space >> expr(',') >> Exp | default_value, 527 Space, ',' >> Space >> Exp | default_value,
538 Space, expr(']') 528 Space, ']'
539 }); 529 });
540 530
541 Invoke = Seperator >> sel({ 531 Invoke = Seperator >> sel({
542 FnArgs, 532 FnArgs,
543 SingleString, 533 SingleString,
544 DoubleString, 534 DoubleString,
545 and_(expr('[')) >> LuaString, 535 and_('[') >> LuaString,
546 and_(expr('{')) >> TableLit 536 and_('{') >> TableLit
547 }); 537 });
548 538
549 SpreadExp = Space >> expr("...") >> Exp; 539 SpreadExp = "..." >> Space >> Exp;
550 540
551 TableValue = sel({ 541 TableValue = sel({
552 variable_pair_def, 542 variable_pair_def,
@@ -557,47 +547,47 @@ YueParser::YueParser() {
557 normal_def 547 normal_def
558 }); 548 });
559 549
560 table_lit_lines = SpaceBreak >> TableLitLine >> *(-(Space >> expr(',')) >> SpaceBreak >> TableLitLine) >> -(Space >> expr(',')); 550 table_lit_lines = SpaceBreak >> TableLitLine >> *(-(Space >> ',') >> SpaceBreak >> TableLitLine) >> -(Space >> ',');
561 551
562 TableLit = seq({ 552 TableLit = seq({
563 Space, expr('{'), Seperator, 553 Space, '{', Seperator,
564 -TableValueList, 554 -(Space >> TableValueList),
565 -(Space >> expr(',')), 555 -(Space >> ','),
566 -table_lit_lines, 556 -table_lit_lines,
567 White, expr('}') 557 White, '}'
568 }); 558 });
569 559
570 TableValueList = TableValue >> *(Space >> expr(',') >> TableValue); 560 TableValueList = TableValue >> *(Space >> ',' >> Space >> TableValue);
571 561
572 TableLitLine = ( 562 TableLitLine = (
573 PushIndent >> (TableValueList >> PopIndent | PopIndent) 563 PushIndent >> (Space >> TableValueList >> PopIndent | PopIndent)
574 ) | ( 564 ) | (
575 Space 565 Space
576 ); 566 );
577 567
578 TableBlockInner = Seperator >> KeyValueLine >> *(+SpaceBreak >> KeyValueLine); 568 TableBlockInner = Seperator >> KeyValueLine >> *(+SpaceBreak >> KeyValueLine);
579 TableBlock = +SpaceBreak >> Advance >> ensure(TableBlockInner, PopIndent); 569 TableBlock = +SpaceBreak >> Advance >> ensure(TableBlockInner, PopIndent);
580 TableBlockIndent = Space >> expr('*') >> Seperator >> disable_arg_table_block( 570 TableBlockIndent = '*' >> Seperator >> disable_arg_table_block(
581 KeyValueList >> -(Space >> expr(',')) >> 571 Space >> KeyValueList >> -(Space >> ',') >>
582 -(+SpaceBreak >> Advance >> ensure(KeyValueList >> -(Space >> expr(',')) >> *(+SpaceBreak >> KeyValueLine), PopIndent))); 572 -(+SpaceBreak >> Advance >> Space >> ensure(KeyValueList >> -(Space >> ',') >> *(+SpaceBreak >> KeyValueLine), PopIndent)));
583 573
584 class_member_list = Seperator >> KeyValue >> *(Space >> expr(',') >> KeyValue); 574 class_member_list = Seperator >> KeyValue >> *(Space >> ',' >> Space >> KeyValue);
585 ClassLine = CheckIndent >> (class_member_list | Space >> Statement) >> -(Space >> expr(',')); 575 ClassLine = CheckIndent >> Space >> (class_member_list | Statement) >> -(Space >> ',');
586 ClassBlock = seq({+SpaceBreak, Advance, Seperator, ClassLine, *(+SpaceBreak >> ClassLine), PopIndent}); 576 ClassBlock = seq({+SpaceBreak, Advance, Seperator, ClassLine, *(+SpaceBreak >> ClassLine), PopIndent});
587 577
588 ClassDecl = seq({ 578 ClassDecl = seq({
589 Space, key("class"), not_(expr(':')), 579 key("class"), not_(':'),
590 disable_arg_table_block(seq({ 580 disable_arg_table_block(seq({
591 -Assignable, 581 -(Space >> Assignable),
592 -seq({Space, key("extends"), PreventIndent, ensure(Exp, PopIndent)}), 582 -seq({Space, key("extends"), PreventIndent, Space, ensure(Exp, PopIndent)}),
593 -seq({Space, key("using"), PreventIndent, ensure(ExpList, PopIndent)}) 583 -seq({Space, key("using"), PreventIndent, Space, ensure(ExpList, PopIndent)})
594 })), 584 })),
595 -ClassBlock 585 -ClassBlock
596 }); 586 });
597 587
598 global_values = NameList >> -(Space >> expr('=') >> (TableBlock | ExpListLow)); 588 global_values = NameList >> -(Space >> '=' >> Space >> (TableBlock | ExpListLow));
599 global_op = expr('*') | expr('^'); 589 global_op = sel({'*', '^'});
600 Global = key("global") >> sel({ClassDecl, Space >> global_op, global_values}); 590 Global = key("global") >> Space >> sel({ClassDecl, global_op, global_values});
601 591
602 export_default = key("default"); 592 export_default = key("default");
603 593
@@ -605,7 +595,7 @@ YueParser::YueParser() {
605 State* st = reinterpret_cast<State*>(item.user_data); 595 State* st = reinterpret_cast<State*>(item.user_data);
606 st->exportCount++; 596 st->exportCount++;
607 return true; 597 return true;
608 }) >> (pl::user(Space >> export_default >> Exp, [](const item_t& item) { 598 }) >> (pl::user(Space >> export_default >> Space >> Exp, [](const item_t& item) {
609 State* st = reinterpret_cast<State*>(item.user_data); 599 State* st = reinterpret_cast<State*>(item.user_data);
610 if (st->exportDefault) { 600 if (st->exportDefault) {
611 throw ParserError("export default has already been declared", *item.begin, *item.end); 601 throw ParserError("export default has already been declared", *item.begin, *item.end);
@@ -622,32 +612,31 @@ YueParser::YueParser() {
622 throw ParserError("can not export any more items when 'export default' is declared", *item.begin, *item.end); 612 throw ParserError("can not export any more items when 'export default' is declared", *item.begin, *item.end);
623 } 613 }
624 return true; 614 return true;
625 }) >> ExpList >> -Assign) 615 }) >> Space >> ExpList >> -(Space >> Assign))
626 | Space >> pl::user(Macro, [](const item_t& item) { 616 | Space >> pl::user(Macro, [](const item_t& item) {
627 State* st = reinterpret_cast<State*>(item.user_data); 617 State* st = reinterpret_cast<State*>(item.user_data);
628 st->exportMacro = true; 618 st->exportMacro = true;
629 return true; 619 return true;
630 })) >> not_(Space >> statement_appendix); 620 })) >> not_(Space >> statement_appendix);
631 621
632 variable_pair = Space >> expr(':') >> Variable; 622 variable_pair = ':' >> Variable;
633 623
634 normal_pair = seq({ 624 normal_pair = seq({
635 Space,
636 sel({ 625 sel({
637 KeyName, 626 KeyName,
638 seq({expr('['), not_('['), Exp, Space >> expr(']')}), 627 seq({'[', not_('['), Space, Exp, Space, ']'}),
639 String 628 String
640 }), 629 }),
641 expr(':'), not_(':'), 630 ':', not_(':'), Space,
642 sel({Exp, TableBlock, +SpaceBreak >> Exp}) 631 sel({Exp, TableBlock, +SpaceBreak >> Space >> Exp})
643 }); 632 });
644 633
645 meta_variable_pair = Space >> expr(":<") >> Space >> Variable >> Space >> expr('>'); 634 meta_variable_pair = ":<" >> Space >> Variable >> Space >> '>';
646 635
647 meta_normal_pair = Space >> expr('<') >> Space >> -meta_index >> Space >> expr(">:") >> 636 meta_normal_pair = '<' >> Space >> -meta_index >> Space >> ">:" >> Space >>
648 sel({Exp, TableBlock, +(SpaceBreak) >> Exp}); 637 sel({Exp, TableBlock, +(SpaceBreak) >> Space >> Exp});
649 638
650 destruct_def = -seq({Space, expr('='), Exp}); 639 destruct_def = -seq({Space, '=', Space, Exp});
651 variable_pair_def = variable_pair >> destruct_def; 640 variable_pair_def = variable_pair >> destruct_def;
652 normal_pair_def = normal_pair >> destruct_def; 641 normal_pair_def = normal_pair >> destruct_def;
653 meta_variable_pair_def = meta_variable_pair >> destruct_def; 642 meta_variable_pair_def = meta_variable_pair >> destruct_def;
@@ -660,55 +649,56 @@ YueParser::YueParser() {
660 meta_variable_pair, 649 meta_variable_pair,
661 meta_normal_pair 650 meta_normal_pair
662 }); 651 });
663 KeyValueList = KeyValue >> *(Space >> expr(',') >> KeyValue); 652 KeyValueList = KeyValue >> *(Space >> ',' >> Space >> KeyValue);
664 KeyValueLine = CheckIndent >> sel({ 653 KeyValueLine = CheckIndent >> Space >> sel({
665 KeyValueList >> -(Space >> expr(',')), 654 KeyValueList >> -(Space >> ','),
666 TableBlockIndent, 655 TableBlockIndent,
667 Space >> expr('*') >> sel({SpreadExp, Exp, TableBlock}) 656 '*' >> Space >> sel({SpreadExp, Exp, TableBlock})
668 }); 657 });
669 658
670 FnArgDef = (Variable | SelfName >> -existential_op) >> -(Space >> expr('=') >> Space >> Exp); 659 FnArgDef = (Variable | SelfName >> -existential_op) >> -(Space >> '=' >> Space >> Exp);
671 660
672 FnArgDefList = Space >> Seperator >> ( 661 FnArgDefList = Seperator >> (
673 seq({ 662 seq({
674 FnArgDef, 663 FnArgDef,
675 *seq({(Space >> expr(',') | Break), White, FnArgDef}), 664 *seq({Space, ',' | Break, White, FnArgDef}),
676 -seq({(Space >> expr(',') | Break), White, VarArg}) 665 -seq({Space, ',' | Break, White, VarArg})
677 }) | 666 }) |
678 VarArg 667 VarArg
679 ); 668 );
680 669
681 outer_var_shadow = Space >> key("using") >> (NameList | Space >> expr("nil")); 670 outer_var_shadow = key("using") >> Space >> (NameList | key("nil"));
682 671
683 FnArgsDef = seq({Space, expr('('), White, -FnArgDefList, -outer_var_shadow, White, Space, expr(')')}); 672 FnArgsDef = seq({'(', White, -FnArgDefList, -(Space >> outer_var_shadow), White, ')'});
684 fn_arrow = expr("->") | expr("=>"); 673 fn_arrow = sel({"->", "=>"});
685 FunLit = seq({-FnArgsDef, Space, fn_arrow, -Body}); 674 FunLit = seq({-FnArgsDef, Space, fn_arrow, -(Space >> Body)});
686 675
687 MacroName = expr('$') >> Name; 676 MacroName = '$' >> Name;
688 macro_args_def = Space >> expr('(') >> White >> -FnArgDefList >> White >> Space >> expr(')'); 677 macro_args_def = '(' >> White >> -FnArgDefList >> White >> ')';
689 MacroLit = -macro_args_def >> Space >> expr("->") >> Body; 678 MacroLit = -(macro_args_def >> Space) >> "->" >> Space >> Body;
690 Macro = key("macro") >> Space >> Name >> Space >> expr('=') >> MacroLit; 679 Macro = key("macro") >> Space >> Name >> Space >> '=' >> Space >> MacroLit;
691 MacroInPlace = expr('$') >> Space >> expr("->") >> Body; 680 MacroInPlace = '$' >> Space >> "->" >> Space >> Body;
692 681
693 NameList = Seperator >> Space >> Variable >> *(Space >> expr(',') >> Space >> Variable); 682 NameList = Seperator >> Variable >> *(Space >> ',' >> Space >> Variable);
694 NameOrDestructure = Space >> Variable | TableLit; 683 NameOrDestructure = Variable | TableLit;
695 AssignableNameList = Seperator >> NameOrDestructure >> *(Space >> expr(',') >> NameOrDestructure); 684 AssignableNameList = Seperator >> NameOrDestructure >> *(Space >> ',' >> Space >> NameOrDestructure);
696 685
697 fn_arrow_back = expr('<') >> set("-="); 686 fn_arrow_back = '<' >> set("-=");
698 Backcall = seq({-FnArgsDef, Space, fn_arrow_back, Space, ChainValue}); 687 Backcall = seq({-(FnArgsDef >> Space), fn_arrow_back, Space, ChainValue});
699 688
700 PipeBody = seq({ 689 PipeBody = seq({
701 Seperator, 690 Seperator,
702 PipeOperator, 691 PipeOperator,
692 Space,
703 unary_exp, 693 unary_exp,
704 *seq({+SpaceBreak, CheckIndent, Space, PipeOperator, unary_exp}) 694 *seq({+SpaceBreak, CheckIndent, Space, PipeOperator, Space, unary_exp})
705 }); 695 });
706 696
707 ExpList = Seperator >> Exp >> *(Space >> expr(',') >> Exp); 697 ExpList = Seperator >> Exp >> *(Space >> ',' >> Space >> Exp);
708 ExpListLow = Seperator >> Exp >> *(Space >> set(",;") >> Exp); 698 ExpListLow = Seperator >> Exp >> *(Space >> set(",;") >> Space >> Exp);
709 699
710 ArgLine = CheckIndent >> Exp >> *(Space >> expr(',') >> Exp); 700 ArgLine = CheckIndent >> Space >> Exp >> *(Space >> ',' >> Space >> Exp);
711 ArgBlock = ArgLine >> *(Space >> expr(',') >> SpaceBreak >> ArgLine) >> PopIndent; 701 ArgBlock = ArgLine >> *(Space >> ',' >> SpaceBreak >> ArgLine) >> PopIndent;
712 702
713 arg_table_block = pl::user(true_(), [](const item_t& item) { 703 arg_table_block = pl::user(true_(), [](const item_t& item) {
714 State* st = reinterpret_cast<State*>(item.user_data); 704 State* st = reinterpret_cast<State*>(item.user_data);
@@ -716,25 +706,25 @@ YueParser::YueParser() {
716 }) >> TableBlock; 706 }) >> TableBlock;
717 707
718 invoke_args_with_table = 708 invoke_args_with_table =
719 Space >> expr(',') >> ( 709 ',' >> (
720 TableBlock | 710 TableBlock |
721 SpaceBreak >> Advance >> ArgBlock >> -arg_table_block 711 SpaceBreak >> Advance >> ArgBlock >> -arg_table_block
722 ) | arg_table_block; 712 ) | arg_table_block;
723 713
724 leading_spaces_error = pl::user(+space_one >> expr('(') >> Exp >> +(Space >> expr(',') >> Exp) >> Space >> expr(')'), [](const item_t& item) { 714 leading_spaces_error = pl::user(+space_one >> '(' >> Space >> Exp >> +(Space >> ',' >> Space >> Exp) >> Space >> ')', [](const item_t& item) {
725 throw ParserError("write invoke arguments in parentheses without leading spaces or just leading spaces without parentheses", *item.begin, *item.end); 715 throw ParserError("write invoke arguments in parentheses without leading spaces or just leading spaces without parentheses", *item.begin, *item.end);
726 return false; 716 return false;
727 }); 717 });
728 718
729 InvokeArgs = 719 InvokeArgs =
730 not_(set("-~")) >> Seperator >> 720 not_(set("-~")) >> Space >> Seperator >>
731 sel({ 721 sel({
732 Exp >> *(Space >> expr(',') >> Exp) >> -invoke_args_with_table, 722 Exp >> *(Space >> ',' >> Space >> Exp) >> -(Space >> invoke_args_with_table),
733 arg_table_block, 723 arg_table_block,
734 leading_spaces_error 724 leading_spaces_error
735 }); 725 });
736 726
737 const_value = sel({expr("nil"), expr("true"), expr("false")}) >> not_(AlphaNum); 727 const_value = sel({"nil", "true", "false"}) >> not_(AlphaNum);
738 728
739 SimpleValue = sel({ 729 SimpleValue = sel({
740 TableLit, const_value, If, Switch, Try, With, 730 TableLit, const_value, If, Switch, Try, With,
@@ -743,26 +733,33 @@ YueParser::YueParser() {
743 FunLit, Num 733 FunLit, Num
744 }); 734 });
745 735
746 ExpListAssign = ExpList >> -(Update | Assign) >> not_(Space >> expr('=')); 736 ExpListAssign = ExpList >> -(Space >> (Update | Assign)) >> not_(Space >> '=');
747 737
748 if_line = Space >> IfType >> IfCond; 738 if_line = IfType >> Space >> IfCond;
749 while_line = Space >> WhileType >> Exp; 739 while_line = WhileType >> Space >> Exp;
750 740
751 YueLineComment = *(not_(set("\r\n")) >> Any); 741 YueLineComment = *(not_(set("\r\n")) >> Any);
752 yue_line_comment = expr("--") >> YueLineComment >> and_(Stop); 742 yue_line_comment = "--" >> YueLineComment >> and_(Stop);
753 YueMultilineComment = multi_line_content; 743 YueMultilineComment = multi_line_content;
754 yue_multiline_comment = multi_line_open >> YueMultilineComment >> multi_line_close; 744 yue_multiline_comment = multi_line_open >> YueMultilineComment >> multi_line_close;
755 yue_comment = check_indent >> (yue_multiline_comment >> *(set(" \t") | yue_multiline_comment) >> -yue_line_comment | yue_line_comment) >> and_(Break); 745 yue_comment = check_indent >> sel({
746 seq({
747 yue_multiline_comment,
748 *(set(" \t") | yue_multiline_comment),
749 -yue_line_comment
750 }),
751 yue_line_comment
752 }) >> and_(Break);
756 753
757 ChainAssign = Seperator >> Exp >> +(Space >> expr('=') >> Exp >> Space >> and_('=')) >> Assign; 754 ChainAssign = Seperator >> Exp >> +(Space >> '=' >> Space >> Exp >> Space >> and_('=')) >> Space >> Assign;
758 755
759 statement_appendix = sel({if_line, while_line, CompInner}) >> Space; 756 statement_appendix = sel({if_line, while_line, CompInner}) >> Space;
760 statement_sep = and_(seq({ 757 statement_sep = and_(seq({
761 *SpaceBreak, CheckIndent, Space, 758 *SpaceBreak, CheckIndent, Space,
762 sel({ 759 sel({
763 set("($'\""), 760 set("($'\""),
764 expr("[["), 761 "[[",
765 expr("[=") 762 "[="
766 }) 763 })
767 })); 764 }));
768 Statement = seq({ 765 Statement = seq({
@@ -786,7 +783,7 @@ YueParser::YueParser() {
786 -statement_sep 783 -statement_sep
787 }); 784 });
788 785
789 Body = InBlock | Space >> Statement; 786 Body = InBlock | Statement;
790 787
791 empty_line_break = sel({ 788 empty_line_break = sel({
792 check_indent >> (MultiLineComment >> Space | Comment), 789 check_indent >> (MultiLineComment >> Space | Comment),
@@ -806,7 +803,7 @@ YueParser::YueParser() {
806 }); 803 });
807 Block = seq({Seperator, Line, *(+Break >> Line)}); 804 Block = seq({Seperator, Line, *(+Break >> Line)});
808 805
809 Shebang = expr("#!") >> *(not_(Stop) >> Any); 806 Shebang = "#!" >> *(not_(Stop) >> Any);
810 BlockEnd = seq({Block, White, Stop}); 807 BlockEnd = seq({Block, White, Stop});
811 File = seq({-Shebang, -Block, White, Stop}); 808 File = seq({-Shebang, -Block, White, Stop});
812} 809}