about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2010-12-31 17:28:43 -0800
committerGraydon Hoare <graydon@mozilla.com>2010-12-31 17:28:43 -0800
commit0a2e7f2149c4630afc1d981a8e8de8e25b71b43f (patch)
treebbdc7bb2fc0a9a287b99c4da3464cde0583bb0c4 /src
parent2f6f0dcfbf0f908f9dd352061db37ae8ec0a6855 (diff)
downloadrust-0a2e7f2149c4630afc1d981a8e8de8e25b71b43f.tar.gz
rust-0a2e7f2149c4630afc1d981a8e8de8e25b71b43f.zip
Add restricted-parse mode, and parse bind expressions.
Diffstat (limited to 'src')
-rw-r--r--src/comp/front/parser.rs78
1 files changed, 68 insertions, 10 deletions
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index d799253d982..15930b98c9a 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -15,6 +15,8 @@ state type parser =
           fn peek() -> token.token;
           impure fn bump();
           impure fn err(str s);
+          impure fn restrict(bool r);
+          fn is_restricted() -> bool;
           fn get_session() -> session.session;
           fn get_span() -> common.span;
           fn next_def_id() -> ast.def_id;
@@ -27,6 +29,7 @@ impure fn new_parser(session.session sess,
                            mutable common.pos lo,
                            mutable common.pos hi,
                            mutable ast.def_num def,
+                           mutable bool restricted,
                            ast.crate_num crate,
                            lexer.reader rdr)
         {
@@ -47,6 +50,14 @@ impure fn new_parser(session.session sess,
                 sess.span_err(span, m);
             }
 
+            impure fn restrict(bool r) {
+                restricted = r;
+            }
+
+            fn is_restricted() -> bool {
+                ret restricted;
+            }
+
             fn get_session() -> session.session {
                 ret sess;
             }
@@ -65,7 +76,7 @@ impure fn new_parser(session.session sess,
     auto rdr = lexer.new_reader(srdr, path);
     auto npos = rdr.get_curr_pos();
     ret stdio_parser(sess, lexer.next_token(rdr),
-                     npos, npos, 0, crate, rdr);
+                     npos, npos, 0, false, crate, rdr);
 }
 
 impure fn unexpected(parser p, token.token t) {
@@ -481,6 +492,32 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
             ex = ast.expr_rec(fs.node, ast.ann_none);
         }
 
+        case (token.BIND) {
+            p.bump();
+            auto e = parse_restricted_expr(p);
+            impure fn parse_expr_opt(parser p) -> option.t[@ast.expr] {
+                log "parse expr opt: " + token.to_str(p.peek());
+                alt (p.peek()) {
+                    case (token.UNDERSCORE) {
+                        p.bump();
+                        ret none[@ast.expr];
+                    }
+                    case (_) {
+                        ret some[@ast.expr](parse_expr(p));
+                    }
+                }
+            }
+
+            auto pf = parse_expr_opt;
+            auto es = parse_seq[option.t[@ast.expr]](token.LPAREN,
+                                                     token.RPAREN,
+                                                     some(token.COMMA),
+                                                     pf, p);
+            hi = es.span;
+            auto e_ = ast.expr_bind(e, es.node, ast.ann_none);
+            e = @spanned(lo, hi, e_);
+        }
+
         case (_) {
             alt (parse_lit(p)) {
                 case (some[ast.lit](?lit)) {
@@ -505,15 +542,19 @@ impure fn parse_path_expr(parser p) -> @ast.expr {
         alt (p.peek()) {
 
             case (token.LPAREN) {
-                // Call expr.
-                auto pf = parse_expr;
-                auto es = parse_seq[@ast.expr](token.LPAREN,
-                                               token.RPAREN,
-                                               some(token.COMMA),
-                                               pf, p);
-                hi = es.span;
-                auto e_ = ast.expr_call(e, es.node, ast.ann_none);
-                e = @spanned(lo, hi, e_);
+                if (p.is_restricted()) {
+                    ret e;
+                } else {
+                    // Call expr.
+                    auto pf = parse_expr;
+                    auto es = parse_seq[@ast.expr](token.LPAREN,
+                                                   token.RPAREN,
+                                                   some(token.COMMA),
+                                                   pf, p);
+                    hi = es.span;
+                    auto e_ = ast.expr_call(e, es.node, ast.ann_none);
+                    e = @spanned(lo, hi, e_);
+                }
             }
 
             case (token.DOT) {
@@ -865,7 +906,24 @@ impure fn parse_alt_expr(parser p) -> @ast.expr {
     ret @spanned(lo, hi, expr);
 }
 
+
+impure fn parse_restricted_expr(parser p) -> @ast.expr {
+    ret parse_expr_res(p, true);
+}
+
 impure fn parse_expr(parser p) -> @ast.expr {
+    ret parse_expr_res(p, false);
+}
+
+impure fn parse_expr_res(parser p, bool restrict) -> @ast.expr {
+    auto old = p.is_restricted();
+    p.restrict(restrict);
+    auto e = parse_expr_inner(p);
+    p.restrict(old);
+    ret e;
+}
+
+impure fn parse_expr_inner(parser p) -> @ast.expr {
     alt (p.peek()) {
         case (token.LBRACE) {
             auto blk = parse_block(p);