syntax: Merge parse_for_expr, parse_do_expr

This commit is contained in:
Brian Anderson 2012-06-24 17:07:42 -07:00
parent a8235ff853
commit 20b5ca3d2f

View File

@ -771,9 +771,9 @@ class parser {
} else if self.eat_keyword("if") {
ret pexpr(self.parse_if_expr());
} else if self.eat_keyword("for") {
ret pexpr(self.parse_for_expr());
ret pexpr(self.parse_sugary_call_expr("for", expr_loop_body));
} else if self.eat_keyword("do") {
ret pexpr(self.parse_do_expr());
ret pexpr(self.parse_sugary_call_expr("do", expr_do_body));
} else if self.eat_keyword("while") {
ret pexpr(self.parse_while_expr());
} else if self.eat_keyword("loop") {
@ -1283,36 +1283,20 @@ class parser {
}
}
fn parse_for_expr() -> @expr {
fn parse_sugary_call_expr(keyword: str, ctor: fn(+@expr) -> 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_loop_body(b_arg));
ctor(b_arg));
@{node: expr_call(f, vec::init(args) + [last], true)
with *call}
}
_ {
self.span_fatal(lo, "`for` must be followed by a block call");
}
}
}
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");
self.span_fatal(
lo, #fmt("`%s` must be followed by a block call", keyword));
}
}
}