Skip to content

Commit 01bdb04

Browse files
committed
---
yaml --- r: 1268 b: refs/heads/master c: 33b342e h: refs/heads/master v: v3
1 parent a484534 commit 01bdb04

File tree

3 files changed

+57
-29
lines changed

3 files changed

+57
-29
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 9d3ebd6a57b51f02788331f56681e8f593d82e60
2+
refs/heads/master: 33b342e89192a0f326a0234a564c8a229839cebe

trunk/src/comp/front/ast.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ tag expr_ {
150150
expr_cast(@expr, @ty, ann);
151151
expr_if(@expr, block, option.t[block], ann);
152152
expr_while(@expr, block, ann);
153+
expr_for(@local, @expr, block, ann);
153154
expr_do_while(block, @expr, ann);
154155
expr_alt(@expr, vec[arm], ann);
155156
expr_block(block, ann);

trunk/src/comp/front/parser.rs

Lines changed: 55 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -891,6 +891,29 @@ impure fn parse_if_expr(parser p) -> @ast.expr {
891891
ret @spanned(lo, hi, ast.expr_if(cond, thn, els, ast.ann_none));
892892
}
893893

894+
impure fn parse_for_expr(parser p) -> @ast.expr {
895+
auto lo = p.get_span();
896+
auto hi = lo;
897+
898+
expect(p, token.FOR);
899+
expect (p, token.LPAREN);
900+
901+
let @ast.local local;
902+
if (p.peek() == token.AUTO) {
903+
p.bump();
904+
local = parse_auto_local(p);
905+
} else {
906+
local = parse_typed_local(p);
907+
}
908+
expect(p, token.IN);
909+
910+
auto seq = parse_expr(p);
911+
expect(p, token.RPAREN);
912+
auto body = parse_block(p);
913+
hi = body.span;
914+
ret @spanned(lo, hi, ast.expr_for(local, seq, body, ast.ann_none));
915+
}
916+
894917
impure fn parse_while_expr(parser p) -> @ast.expr {
895918
auto lo = p.get_span();
896919
auto hi = lo;
@@ -979,6 +1002,9 @@ impure fn parse_expr_inner(parser p) -> @ast.expr {
9791002
case (token.IF) {
9801003
ret parse_if_expr(p);
9811004
}
1005+
case (token.FOR) {
1006+
ret parse_for_expr(p);
1007+
}
9821008
case (token.WHILE) {
9831009
ret parse_while_expr(p);
9841010
}
@@ -1052,43 +1078,40 @@ impure fn parse_pat(parser p) -> @ast.pat {
10521078
ret @spanned(lo, hi, pat);
10531079
}
10541080

1055-
impure fn parse_let(parser p) -> @ast.decl {
1056-
auto lo = p.get_span();
1057-
1058-
expect(p, token.LET);
1059-
auto ty = parse_ty(p);
1081+
impure fn parse_local(&option.t[@ast.ty] tyopt, parser p) -> @ast.local {
10601082
auto ident = parse_ident(p);
10611083
auto init = parse_initializer(p);
1084+
ret @rec(ty = tyopt,
1085+
infer = false,
1086+
ident = ident,
1087+
init = init,
1088+
id = p.next_def_id(),
1089+
ann = ast.ann_none);
1090+
}
10621091

1063-
auto hi = p.get_span();
1092+
impure fn parse_typed_local(parser p) -> @ast.local {
1093+
auto ty = parse_ty(p);
1094+
ret parse_local(some(ty), p);
1095+
}
10641096

1065-
let ast.local local = rec(ty = some(ty),
1066-
infer = false,
1067-
ident = ident,
1068-
init = init,
1069-
id = p.next_def_id(),
1070-
ann = ast.ann_none);
1097+
impure fn parse_auto_local(parser p) -> @ast.local {
1098+
ret parse_local(none[@ast.ty], p);
1099+
}
10711100

1072-
ret @spanned(lo, hi, ast.decl_local(@local));
1101+
impure fn parse_let(parser p) -> @ast.decl {
1102+
auto lo = p.get_span();
1103+
expect(p, token.LET);
1104+
auto local = parse_typed_local(p);
1105+
auto hi = p.get_span();
1106+
ret @spanned(lo, hi, ast.decl_local(local));
10731107
}
10741108

10751109
impure fn parse_auto(parser p) -> @ast.decl {
10761110
auto lo = p.get_span();
1077-
10781111
expect(p, token.AUTO);
1079-
auto ident = parse_ident(p);
1080-
auto init = parse_initializer(p);
1081-
1112+
auto local = parse_auto_local(p);
10821113
auto hi = p.get_span();
1083-
1084-
let ast.local local = rec(ty = none[@ast.ty],
1085-
infer = true,
1086-
ident = ident,
1087-
init = init,
1088-
id = p.next_def_id(),
1089-
ann = ast.ann_none);
1090-
1091-
ret @spanned(lo, hi, ast.decl_local(@local));
1114+
ret @spanned(lo, hi, ast.decl_local(local));
10921115
}
10931116

10941117
impure fn parse_stmt(parser p) -> @ast.stmt {
@@ -1150,6 +1173,11 @@ impure fn parse_stmt(parser p) -> @ast.stmt {
11501173
ret @spanned(lo, e.span, ast.stmt_expr(e));
11511174
}
11521175

1176+
case (token.FOR) {
1177+
auto e = parse_expr(p);
1178+
ret @spanned(lo, e.span, ast.stmt_expr(e));
1179+
}
1180+
11531181
case (token.WHILE) {
11541182
auto e = parse_expr(p);
11551183
ret @spanned(lo, e.span, ast.stmt_expr(e));
@@ -1279,6 +1307,7 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
12791307
case (ast.expr_lit(_,_)) { ret true; }
12801308
case (ast.expr_cast(_,_,_)) { ret true; }
12811309
case (ast.expr_if(_,_,_,_)) { ret false; }
1310+
case (ast.expr_for(_,_,_,_)) { ret false; }
12821311
case (ast.expr_while(_,_,_)) { ret false; }
12831312
case (ast.expr_do_while(_,_,_)) { ret false; }
12841313
case (ast.expr_alt(_,_,_)) { ret false; }
@@ -1289,10 +1318,8 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
12891318
case (ast.expr_field(_,_,_)) { ret true; }
12901319
case (ast.expr_index(_,_,_)) { ret true; }
12911320
case (ast.expr_path(_,_,_)) { ret true; }
1292-
case (_) { fail; }
12931321
}
12941322
}
1295-
case (_) { fail; }
12961323
}
12971324
}
12981325

0 commit comments

Comments
 (0)