diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-06-18 17:42:09 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-06-18 17:42:30 -0700 |
| commit | 1ec5a5c635dba820246cbb4c7bea031b6add3b07 (patch) | |
| tree | 532bcd395a250706f08436d6b83e7fdba4a5c23c /src/libsyntax/parse/parser.rs | |
| parent | ee9e5b9d201d876c07b00663e2df224eb170a0f2 (diff) | |
| download | rust-1ec5a5c635dba820246cbb4c7bea031b6add3b07.tar.gz rust-1ec5a5c635dba820246cbb4c7bea031b6add3b07.zip | |
Add 'do' expressions
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 08eaa779291..45badde0016 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -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(); |
