aboutsummaryrefslogtreecommitdiff
path: root/src/comp/front
diff options
context:
space:
mode:
Diffstat (limited to 'src/comp/front')
-rw-r--r--src/comp/front/ast.rs6
-rw-r--r--src/comp/front/eval.rs4
-rw-r--r--src/comp/front/lexer.rs12
-rw-r--r--src/comp/front/parser.rs49
4 files changed, 61 insertions, 10 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs
index 59a928be..a7ff64fa 100644
--- a/src/comp/front/ast.rs
+++ b/src/comp/front/ast.rs
@@ -232,6 +232,8 @@ tag expr_ {
expr_block(block, ann);
expr_assign(@expr /* TODO: @expr|is_lval */, @expr, ann);
expr_assign_op(binop, @expr /* TODO: @expr|is_lval */, @expr, ann);
+ expr_send(@expr /* TODO: @expr|is_lval */, @expr, ann);
+ expr_recv(@expr /* TODO: @expr|is_lval */, @expr, ann);
expr_field(@expr, ident, ann);
expr_index(@expr, @expr, ann);
expr_path(path, option.t[def], ann);
@@ -242,6 +244,8 @@ tag expr_ {
expr_be(@expr);
expr_log(@expr);
expr_check_expr(@expr);
+ expr_port(ann);
+ expr_chan(@expr, ann);
}
type lit = spanned[lit_];
@@ -274,6 +278,8 @@ tag ty_ {
ty_str;
ty_box(@ty);
ty_vec(@ty);
+ ty_port(@ty);
+ ty_chan(@ty);
ty_tup(vec[@ty]);
ty_rec(vec[ty_field]);
ty_fn(proto, vec[ty_arg], @ty); // TODO: effect
diff --git a/src/comp/front/eval.rs b/src/comp/front/eval.rs
index 21a764df..ac249848 100644
--- a/src/comp/front/eval.rs
+++ b/src/comp/front/eval.rs
@@ -384,7 +384,7 @@ impure fn eval_crate_directive(parser p,
case (none[filename]) {}
}
- auto full_path = prefix + std.os.path_sep() + file_path;
+ auto full_path = prefix + std.fs.path_sep() + file_path;
auto start_id = p.next_def_id();
auto p0 = new_parser(p.get_session(), e, start_id, full_path);
@@ -407,7 +407,7 @@ impure fn eval_crate_directive(parser p,
case (none[filename]) {}
}
- auto full_path = prefix + std.os.path_sep() + path;
+ auto full_path = prefix + std.fs.path_sep() + path;
auto m0 = eval_crate_directives_to_mod(p, e, cdirs, full_path);
auto im = ast.item_mod(id, m0, p.next_def_id());
auto i = @spanned(cdir.span, cdir.span, im);
diff --git a/src/comp/front/lexer.rs b/src/comp/front/lexer.rs
index 0e15e3d8..95fd32c7 100644
--- a/src/comp/front/lexer.rs
+++ b/src/comp/front/lexer.rs
@@ -1,4 +1,4 @@
-import std.io.stdio_reader;
+import std.io;
import std._str;
import std.map;
import std.map.hashmap;
@@ -18,9 +18,9 @@ state type reader = state obj {
fn get_reserved() -> hashmap[str,()];
};
-fn new_reader(stdio_reader rdr, str filename) -> reader
+impure fn new_reader(io.reader rdr, str filename) -> reader
{
- state obj reader(stdio_reader rdr,
+ state obj reader(io.reader rdr,
str filename,
mutable char c,
mutable char n,
@@ -72,7 +72,7 @@ fn new_reader(stdio_reader rdr, str filename) -> reader
col += 1u;
}
- n = rdr.getc() as char;
+ n = rdr.read_char() as char;
}
fn mark() {
@@ -200,8 +200,8 @@ fn new_reader(stdio_reader rdr, str filename) -> reader
reserved.insert("m128", ()); // IEEE 754-2008 'decimal128'
reserved.insert("dec", ()); // One of m32, m64, m128
- ret reader(rdr, filename, rdr.getc() as char, rdr.getc() as char,
- 1u, 0u, 1u, 0u, keywords, reserved);
+ ret reader(rdr, filename, rdr.read_char() as char,
+ rdr.read_char() as char, 1u, 0u, 1u, 0u, keywords, reserved);
}
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index 653e45a1..df57bc19 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -115,7 +115,7 @@ impure fn new_parser(session.session sess,
if (_str.ends_with(path, ".rc")) {
ftype = CRATE_FILE;
}
- auto srdr = io.new_stdio_reader(path);
+ auto srdr = io.file_reader(path);
auto rdr = lexer.new_reader(srdr, path);
auto npos = rdr.get_curr_pos();
ret stdio_parser(sess, env, ftype, lexer.next_token(rdr),
@@ -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,18 @@ 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 (token.LARROW) {
+ p.bump();
+ auto rhs = parse_expr(p);
+ ret @spanned(lo, rhs.span,
+ ast.expr_recv(lhs, rhs, ast.ann_none));
+ }
case (_) { /* fall through */ }
}
ret lhs;
@@ -2365,7 +2410,7 @@ impure fn parse_crate_directives(parser p, token.token term)
impure fn parse_crate_from_crate_file(parser p) -> @ast.crate {
auto lo = p.get_span();
auto hi = lo;
- auto prefix = std.path.dirname(lo.filename);
+ auto prefix = std.fs.dirname(lo.filename);
auto cdirs = parse_crate_directives(p, token.EOF);
auto m = eval.eval_crate_directives_to_mod(p, p.get_env(),
cdirs, prefix);