aboutsummaryrefslogtreecommitdiff
path: root/src/comp/front
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2010-10-13 12:43:35 -0700
committerPatrick Walton <[email protected]>2010-10-14 15:20:27 -0700
commit699ef987d78db9d74a2f4e3e5849355998d7b407 (patch)
tree9b85b1b6172cbe5ababfaf3f58d62bd2c973063b /src/comp/front
parentTypecheck tags in "alt" patterns (diff)
downloadrust-699ef987d78db9d74a2f4e3e5849355998d7b407.tar.xz
rust-699ef987d78db9d74a2f4e3e5849355998d7b407.zip
rustc: Start work on lvals
Diffstat (limited to 'src/comp/front')
-rw-r--r--src/comp/front/ast.rs12
-rw-r--r--src/comp/front/parser.rs52
2 files changed, 46 insertions, 18 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs
index aa4ed1e7..5af9fa8b 100644
--- a/src/comp/front/ast.rs
+++ b/src/comp/front/ast.rs
@@ -89,12 +89,18 @@ tag expr_ {
expr_binary(binop, @expr, @expr);
expr_unary(unop, @expr);
expr_lit(@lit);
- expr_name(name, option[referent]);
- expr_field(@expr, ident);
- expr_index(@expr, @expr);
expr_cast(@expr, @ty);
expr_if(@expr, block, option[block]);
expr_block(block);
+ expr_assign(@lval, @expr);
+ expr_lval(@lval);
+}
+
+type lval = spanned[lval_];
+tag lval_ {
+ lval_field(@expr, ident);
+ lval_index(@expr, @expr);
+ lval_name(name, option[referent]);
}
type lit = spanned[lit_];
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index d731bf70..d6968a5b 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -238,6 +238,25 @@ io fn parse_possibly_mutable_expr(parser p) -> tup(bool, @ast.expr) {
ret tup(mut, parse_expr(p));
}
+io fn parse_lval(parser p) -> option[@ast.lval] {
+ auto lo = p.get_span();
+
+ alt (p.peek()) {
+ case (token.IDENT(?i)) {
+ auto n = parse_name(p, i);
+ auto hi = n.span;
+ auto lval = ast.lval_name(n, none[ast.referent]);
+ ret some(@spanned(lo, hi, lval));
+ }
+
+ case (_) {
+ ret none[@ast.lval];
+ }
+ }
+
+ fail;
+}
+
io fn parse_bottom_expr(parser p) -> @ast.expr {
auto lo = p.get_span();
@@ -297,21 +316,22 @@ io fn parse_bottom_expr(parser p) -> @ast.expr {
ex = ast.expr_rec(es.node);
}
- case (token.IDENT(?i)) {
- auto n = parse_name(p, i);
- hi = n.span;
- ex = ast.expr_name(n, none[ast.referent]);
- }
-
case (_) {
- alt (parse_lit(p)) {
- case (some[ast.lit](?lit)) {
- hi = lit.span;
- ex = ast.expr_lit(@lit);
+ alt (parse_lval(p)) {
+ case (some[@ast.lval](?lval)) {
+ hi = lval.span;
+ ex = ast.expr_lval(lval);
}
- case (none[ast.lit]) {
- p.err("expecting expression");
- fail;
+ case (none[@ast.lval]) {
+ alt (parse_lit(p)) {
+ case (some[ast.lit](?lit)) {
+ hi = lit.span;
+ ex = ast.expr_lit(@lit);
+ }
+ case (none[ast.lit]) {
+ p.err("expecting expression");
+ }
+ }
}
}
}
@@ -332,13 +352,15 @@ io fn parse_path_expr(parser p) -> @ast.expr {
case (token.IDENT(?i)) {
hi = p.get_span();
p.bump();
- e = @spanned(lo, hi, ast.expr_field(e, i));
+ auto lv = @spanned(lo, hi, ast.lval_field(e, i));
+ e = @spanned(lo, hi, ast.expr_lval(lv));
}
case (token.LPAREN) {
auto ix = parse_bottom_expr(p);
hi = ix.span;
- e = @spanned(lo, hi, ast.expr_index(e, ix));
+ auto lv = @spanned(lo, hi, ast.lval_index(e, ix));
+ e = @spanned(lo, hi, ast.expr_lval(lv));
}
}
}