Add 'do' expressions
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user