Parsing of remaining expression types
diff --git a/src/expr.rs b/src/expr.rs
index fa7cdf7..4f4dea8 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -295,10 +295,10 @@
     use generics::parsing::lifetime;
     use ident::parsing::ident;
     use item::parsing::item;
-    use lit::parsing::lit;
+    use lit::parsing::{digits, lit};
     use mac::parsing::mac;
     use nom::IResult::Error;
-    use op::parsing::{binop, unop};
+    use op::parsing::{assign_op, binop, unop};
     use ty::parsing::{mutability, path, qpath, ty};
 
     named!(pub expr -> Expr, do_parse!(
@@ -339,6 +339,8 @@
             |
             expr_block
             |
+            expr_range
+            |
             expr_path
             |
             expr_addr_of
@@ -368,12 +370,32 @@
             tap!(ty: and_ascription => {
                 e = Expr::Type(Box::new(e), Box::new(ty));
             })
-    // TODO: Assign
-    // TODO: AssignOp
-    // TODO: Field
-    // TODO: TupField
-    // TODO: Index
-    // TODO: Range
+            |
+            tap!(v: and_assign => {
+                e = Expr::Assign(Box::new(e), Box::new(v));
+            })
+            |
+            tap!(more: and_assign_op => {
+                let (op, v) = more;
+                e = Expr::AssignOp(op, Box::new(e), Box::new(v));
+            })
+            |
+            tap!(field: and_field => {
+                e = Expr::Field(Box::new(e), field);
+            })
+            |
+            tap!(field: and_tup_field => {
+                e = Expr::TupField(Box::new(e), field as usize);
+            })
+            |
+            tap!(i: and_index => {
+                e = Expr::Index(Box::new(e), Box::new(i));
+            })
+            |
+            tap!(more: and_range => {
+                let (limits, hi) = more;
+                e = Expr::Range(Some(Box::new(e)), hi.map(Box::new), limits);
+            })
             |
             tap!(_try: punct!("?") => {
                 e = Expr::Try(Box::new(e));
@@ -665,6 +687,18 @@
         }))
     ));
 
+    named!(expr_range -> Expr, do_parse!(
+        limits: range_limits >>
+        hi: option!(expr) >>
+        (Expr::Range(None, hi.map(Box::new), limits))
+    ));
+
+    named!(range_limits -> RangeLimits, alt!(
+        punct!("...") => { |_| RangeLimits::Closed }
+        |
+        punct!("..") => { |_| RangeLimits::HalfOpen }
+    ));
+
     named!(expr_path -> Expr, map!(qpath, |(qself, path)| Expr::Path(qself, path)));
 
     named!(expr_addr_of -> Expr, do_parse!(
@@ -674,6 +708,18 @@
         (Expr::AddrOf(mutability, Box::new(expr)))
     ));
 
+    named!(and_assign -> Expr, preceded!(punct!("="), expr));
+
+    named!(and_assign_op -> (BinOp, Expr), tuple!(assign_op, expr));
+
+    named!(and_field -> Ident, preceded!(punct!("."), ident));
+
+    named!(and_tup_field -> u64, preceded!(punct!("."), digits));
+
+    named!(and_index -> Expr, delimited!(punct!("["), expr, punct!("]")));
+
+    named!(and_range -> (RangeLimits, Option<Expr>), tuple!(range_limits, option!(expr)));
+
     named!(pub block -> Block, do_parse!(
         punct!("{") >>
         stmts: within_block >>