diff options
| author | Graydon Hoare <[email protected]> | 2011-02-14 18:17:31 -0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2011-02-14 18:17:31 -0800 |
| commit | 4a72a23171d87fb5a0f9b7ad039944856b93bf0f (patch) | |
| tree | c89be3ff4f534ad3d506456a818b5ab7f92a591d /src/comp/front | |
| parent | Add basic front-end support for expr_put. (diff) | |
| download | rust-4a72a23171d87fb5a0f9b7ad039944856b93bf0f.tar.xz rust-4a72a23171d87fb5a0f9b7ad039944856b93bf0f.zip | |
Add basic front-end support for 'for each' loops.
Diffstat (limited to 'src/comp/front')
| -rw-r--r-- | src/comp/front/ast.rs | 1 | ||||
| -rw-r--r-- | src/comp/front/parser.rs | 17 |
2 files changed, 17 insertions, 1 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs index cb2df2a5..9e43d349 100644 --- a/src/comp/front/ast.rs +++ b/src/comp/front/ast.rs @@ -151,6 +151,7 @@ tag expr_ { expr_if(@expr, block, vec[tup(@expr, block)], option.t[block], ann); expr_while(@expr, block, ann); expr_for(@decl, @expr, block, ann); + expr_for_each(@decl, @expr, block, ann); expr_do_while(block, @expr, ann); expr_alt(@expr, vec[arm], ann); expr_block(block, ann); diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index a779d013..ddadc789 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -1049,8 +1049,14 @@ impure fn parse_head_local(parser p) -> @ast.decl { impure fn parse_for_expr(parser p) -> @ast.expr { auto lo = p.get_span(); auto hi = lo; + auto is_each = false; expect(p, token.FOR); + if (p.peek() == token.EACH) { + is_each = true; + p.bump(); + } + expect (p, token.LPAREN); auto decl = parse_head_local(p); @@ -1060,9 +1066,16 @@ impure fn parse_for_expr(parser p) -> @ast.expr { expect(p, token.RPAREN); auto body = parse_block(p); hi = body.span; - ret @spanned(lo, hi, ast.expr_for(decl, seq, body, ast.ann_none)); + if (is_each) { + ret @spanned(lo, hi, ast.expr_for_each(decl, seq, body, + ast.ann_none)); + } else { + ret @spanned(lo, hi, ast.expr_for(decl, seq, body, + ast.ann_none)); + } } + impure fn parse_while_expr(parser p) -> @ast.expr { auto lo = p.get_span(); auto hi = lo; @@ -1422,6 +1435,8 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool { case (ast.expr_cast(_,_,_)) { ret true; } case (ast.expr_if(_,_,_,_,_)) { ret false; } case (ast.expr_for(_,_,_,_)) { ret false; } + case (ast.expr_for_each(_,_,_,_)) + { ret false; } case (ast.expr_while(_,_,_)) { ret false; } case (ast.expr_do_while(_,_,_)) { ret false; } case (ast.expr_alt(_,_,_)) { ret false; } |