about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorBrian Anderson <andersrb@gmail.com>2011-03-02 22:29:53 -0500
committerGraydon Hoare <graydon@mozilla.com>2011-03-14 16:41:46 -0700
commit80e0ebaa86869b6c7063dde8316f98aa5f365316 (patch)
treeada14e658f06d124d638f9a223fa8ef664adde0f /src/comp
parent45f79552614e135821f1c64ff9f9b4a303d4aab6 (diff)
Parse port and chan types, constructors, send statements
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/front/ast.rs5
-rw-r--r--src/comp/front/parser.rs39
2 files changed, 44 insertions, 0 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs
index 5999388ee12..694ff44857b 100644
--- a/src/comp/front/ast.rs
+++ b/src/comp/front/ast.rs
@@ -242,6 +242,9 @@ tag expr_ {
     expr_be(@expr);
     expr_log(@expr);
     expr_check_expr(@expr);
+    expr_port(ann);
+    expr_chan(@expr, ann);
+    expr_send(@expr /* TODO: @expr|is_lval */, @expr, ann);
 }
 
 type lit = spanned[lit_];
@@ -278,6 +281,8 @@ tag ty_ {
     ty_rec(vec[ty_field]);
     ty_fn(proto, vec[ty_arg], @ty);        // TODO: effect
     ty_obj(vec[ty_method]);
+    ty_chan(@ty);
+    ty_port(@ty);
     ty_path(path, option.t[def]);
     ty_mutable(@ty);
     ty_type;
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index 832afe205d5..1f7d4686df4 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -429,6 +429,22 @@ impure fn parse_ty(parser p) -> @ast.ty {
             t = parse_ty_obj(p, hi);
         }
 
+        case (token.PORT) {
+            p.bump();
+            expect(p, token.LBRACKET);
+            t = ast.ty_port(parse_ty(p));
+            hi = p.get_span();
+            expect(p, token.RBRACKET);
+        }
+
+        case (token.CHAN) {
+            p.bump();
+            expect(p, token.LBRACKET);
+            t = ast.ty_chan(parse_ty(p));
+            hi = p.get_span();
+            expect(p, token.RBRACKET);
+        }
+
         case (token.IDENT(_)) {
             t = ast.ty_path(parse_path(p, GREEDY), none[ast.def]);
         }
@@ -799,6 +815,23 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
             }
         }
 
+        case (token.PORT) {
+            p.bump();
+            expect(p, token.LPAREN);
+            expect(p, token.RPAREN);
+            hi = p.get_span();
+            ex = ast.expr_port(ast.ann_none);
+        }
+
+        case (token.CHAN) {
+            p.bump();
+            expect(p, token.LPAREN);
+            auto e = parse_expr(p);
+            hi = e.span;
+            expect(p, token.RPAREN);
+            ex = ast.expr_chan(e, ast.ann_none);
+        }
+
         case (_) {
             auto lit = parse_lit(p);
             hi = lit.span;
@@ -1080,6 +1113,12 @@ impure fn parse_assign_expr(parser p) -> @ast.expr {
             ret @spanned(lo, rhs.span,
                          ast.expr_assign_op(aop, lhs, rhs, ast.ann_none));
         }
+        case (token.SEND) {
+            p.bump();
+            auto rhs = parse_expr(p);
+            ret @spanned(lo, rhs.span,
+                         ast.expr_send(lhs, rhs, ast.ann_none));
+        }
         case (_) { /* fall through */ }
     }
     ret lhs;