diff options
Diffstat (limited to 'src/comp/front')
| -rw-r--r-- | src/comp/front/ast.rs | 6 | ||||
| -rw-r--r-- | src/comp/front/eval.rs | 4 | ||||
| -rw-r--r-- | src/comp/front/lexer.rs | 12 | ||||
| -rw-r--r-- | src/comp/front/parser.rs | 49 |
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); |