From 699ef987d78db9d74a2f4e3e5849355998d7b407 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 13 Oct 2010 12:43:35 -0700 Subject: rustc: Start work on lvals --- src/comp/front/ast.rs | 12 ++++++++--- src/comp/front/parser.rs | 52 ++++++++++++++++++++++++++++++++++-------------- 2 files changed, 46 insertions(+), 18 deletions(-) (limited to 'src/comp/front') 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)); } } } -- cgit v1.2.3