aboutsummaryrefslogtreecommitdiff
path: root/src/comp/front/parser.rs
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2011-01-20 15:02:12 -0800
committerGraydon Hoare <[email protected]>2011-01-20 15:02:12 -0800
commita8af013077c01901426f7cb829a98c7f1fbe6613 (patch)
tree2b48bd91d52cb31e54bc20f012a0e2d46c7a9cd9 /src/comp/front/parser.rs
parenttypo (diff)
downloadrust-a8af013077c01901426f7cb829a98c7f1fbe6613.tar.xz
rust-a8af013077c01901426f7cb829a98c7f1fbe6613.zip
Adjust AST encoding, teach fold about linear for loops.
Diffstat (limited to 'src/comp/front/parser.rs')
-rw-r--r--src/comp/front/parser.rs31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index ec427075..f57add7e 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -891,27 +891,35 @@ impure fn parse_if_expr(parser p) -> @ast.expr {
ret @spanned(lo, hi, ast.expr_if(cond, thn, els, ast.ann_none));
}
-impure fn parse_for_expr(parser p) -> @ast.expr {
+impure fn parse_head_local(parser p) -> @ast.decl {
auto lo = p.get_span();
- auto hi = lo;
-
- expect(p, token.FOR);
- expect (p, token.LPAREN);
-
let @ast.local local;
if (p.peek() == token.AUTO) {
- p.bump();
local = parse_auto_local(p);
} else {
local = parse_typed_local(p);
}
+ auto hi = p.get_span();
+ ret @spanned(lo, hi, ast.decl_local(local));
+}
+
+
+
+impure fn parse_for_expr(parser p) -> @ast.expr {
+ auto lo = p.get_span();
+ auto hi = lo;
+
+ expect(p, token.FOR);
+ expect (p, token.LPAREN);
+
+ auto decl = parse_head_local(p);
expect(p, token.IN);
auto seq = parse_expr(p);
expect(p, token.RPAREN);
auto body = parse_block(p);
hi = body.span;
- ret @spanned(lo, hi, ast.expr_for(local, seq, body, ast.ann_none));
+ ret @spanned(lo, hi, ast.expr_for(decl, seq, body, ast.ann_none));
}
impure fn parse_while_expr(parser p) -> @ast.expr {
@@ -1078,7 +1086,8 @@ impure fn parse_pat(parser p) -> @ast.pat {
ret @spanned(lo, hi, pat);
}
-impure fn parse_local(&option.t[@ast.ty] tyopt, parser p) -> @ast.local {
+impure fn parse_local_full(&option.t[@ast.ty] tyopt,
+ parser p) -> @ast.local {
auto ident = parse_ident(p);
auto init = parse_initializer(p);
ret @rec(ty = tyopt,
@@ -1091,11 +1100,11 @@ impure fn parse_local(&option.t[@ast.ty] tyopt, parser p) -> @ast.local {
impure fn parse_typed_local(parser p) -> @ast.local {
auto ty = parse_ty(p);
- ret parse_local(some(ty), p);
+ ret parse_local_full(some(ty), p);
}
impure fn parse_auto_local(parser p) -> @ast.local {
- ret parse_local(none[@ast.ty], p);
+ ret parse_local_full(none[@ast.ty], p);
}
impure fn parse_let(parser p) -> @ast.decl {