Add 'do' expressions

This commit is contained in:
Brian Anderson
2012-06-18 17:42:09 -07:00
parent ee9e5b9d20
commit 1ec5a5c635
18 changed files with 91 additions and 8 deletions

View File

@@ -772,6 +772,8 @@ class parser {
ret pexpr(self.parse_if_expr());
} else if self.eat_keyword("for") {
ret pexpr(self.parse_for_expr());
} else if self.eat_keyword("do") {
ret pexpr(self.parse_do_expr());
} else if self.eat_keyword("while") {
ret pexpr(self.parse_while_expr());
} else if self.eat_keyword("loop") {
@@ -1312,6 +1314,23 @@ class parser {
}
}
fn parse_do_expr() -> @expr {
let lo = self.last_span;
let call = self.parse_expr_res(RESTRICT_STMT_EXPR);
alt call.node {
expr_call(f, args, true) {
let b_arg = vec::last(args);
let last = self.mk_expr(b_arg.span.lo, b_arg.span.hi,
expr_do_body(b_arg));
@{node: expr_call(f, vec::init(args) + [last], true)
with *call}
}
_ {
self.span_fatal(lo, "`do` must be followed by a block call");
}
}
}
fn parse_while_expr() -> @expr {
let lo = self.last_span.lo;
let cond = self.parse_expr();