From 60ba52b3e022aa88b011295b38fcf50fe440d1f9 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 5 Aug 2018 18:24:56 +0300 Subject: for && array --- src/grammar/expressions/atom.rs | 47 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'src/grammar') diff --git a/src/grammar/expressions/atom.rs b/src/grammar/expressions/atom.rs index 65b9e5ef0..e4f681c17 100644 --- a/src/grammar/expressions/atom.rs +++ b/src/grammar/expressions/atom.rs @@ -44,11 +44,13 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option tuple_expr(p), + L_BRACK => array_expr(p), PIPE => lambda_expr(p), MOVE_KW if la == PIPE => lambda_expr(p), IF_KW => if_expr(p), WHILE_KW => while_expr(p), LOOP_KW => loop_expr(p), + FOR_KW => for_expr(p), MATCH_KW => match_expr(p), UNSAFE_KW if la == L_CURLY => block_expr(p), L_CURLY => block_expr(p), @@ -86,6 +88,36 @@ fn tuple_expr(p: &mut Parser) -> CompletedMarker { m.complete(p, if saw_expr && !saw_comma { PAREN_EXPR } else { TUPLE_EXPR }) } +// test array_expr +// fn foo() { +// []; +// [1]; +// [1, 2,]; +// [1; 2]; +// } +fn array_expr(p: &mut Parser) -> CompletedMarker { + assert!(p.at(L_BRACK)); + let m = p.start(); + p.bump(); + if p.eat(R_BRACK) { + return m.complete(p, ARRAY_EXPR); + } + expr(p); + if p.eat(SEMI) { + expr(p); + p.expect(R_BRACK); + return m.complete(p, ARRAY_EXPR); + } + while !p.at(EOF) && !p.at(R_BRACK) { + p.expect(COMMA); + if !p.at(R_BRACK) { + expr(p); + } + } + p.expect(R_BRACK); + m.complete(p, ARRAY_EXPR) +} + // test lambda_expr // fn foo() { // || (); @@ -156,6 +188,21 @@ fn loop_expr(p: &mut Parser) -> CompletedMarker { m.complete(p, LOOP_EXPR) } +// test for_expr +// fn foo() { +// for x in [] {}; +// } +fn for_expr(p: &mut Parser) -> CompletedMarker { + assert!(p.at(FOR_KW)); + let m = p.start(); + p.bump(); + patterns::pattern(p); + p.expect(IN_KW); + expr_no_struct(p); + block(p); + m.complete(p, FOR_EXPR) +} + // test cond // fn foo() { if let Some(_) = None {} } fn cond(p: &mut Parser) { -- cgit v1.2.3