about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2012-06-25 13:29:41 -0700
committerTim Chevalier <chevalier@alum.wellesley.edu>2012-06-25 13:29:41 -0700
commitda470ff5b8b970c90b4dce3885a2908d477c1021 (patch)
treef65aa2d105f18cdeb79321a37e47e26a5f592149 /src/libsyntax/parse
parent44d0a061be0ec9cae51c61b7bb335e8c4b8c6cf5 (diff)
parentfad307d7b4aa5e7ff6cf30194b069062aaad1a89 (diff)
downloadrust-da470ff5b8b970c90b4dce3885a2908d477c1021.tar.gz
rust-da470ff5b8b970c90b4dce3885a2908d477c1021.zip
Merge
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/parser.rs31
-rw-r--r--src/libsyntax/parse/token.rs1
2 files changed, 8 insertions, 24 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 2196ae9d4be..a1043c4ed2f 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -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,21 @@ 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));
           }
         }
     }
@@ -1956,7 +1941,7 @@ class parser {
         let rp = self.parse_region_param();
         let ty_params = self.parse_ty_params();
         let class_path = self.ident_to_path_tys(class_name, rp, ty_params);
-        let ifaces : [@iface_ref] = if self.eat_keyword("implements")
+        let ifaces : [@iface_ref] = if self.eat(token::COLON)
             { self.parse_iface_ref_list() }
         else { [] };
         self.expect(token::LBRACE);
diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs
index 478d7f53658..9240e3d7a9f 100644
--- a/src/libsyntax/parse/token.rs
+++ b/src/libsyntax/parse/token.rs
@@ -251,7 +251,6 @@ fn contextual_keyword_table() -> hashmap<str, ()> {
     let keys = [
         "as",
         "else",
-        "implements",
         "move",
         "of",
         "priv", "pub",