about summary refs log tree commit diff
path: root/src/libsyntax/parse/parser.rs
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-06-18 17:42:09 -0700
committerBrian Anderson <banderson@mozilla.com>2012-06-18 17:42:30 -0700
commit1ec5a5c635dba820246cbb4c7bea031b6add3b07 (patch)
tree532bcd395a250706f08436d6b83e7fdba4a5c23c /src/libsyntax/parse/parser.rs
parentee9e5b9d201d876c07b00663e2df224eb170a0f2 (diff)
downloadrust-1ec5a5c635dba820246cbb4c7bea031b6add3b07.tar.gz
rust-1ec5a5c635dba820246cbb4c7bea031b6add3b07.zip
Add 'do' expressions
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
-rw-r--r--src/libsyntax/parse/parser.rs19
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();