diff options
| author | Patrick Walton <[email protected]> | 2010-10-13 12:43:35 -0700 |
|---|---|---|
| committer | Patrick Walton <[email protected]> | 2010-10-14 15:20:27 -0700 |
| commit | 699ef987d78db9d74a2f4e3e5849355998d7b407 (patch) | |
| tree | 9b85b1b6172cbe5ababfaf3f58d62bd2c973063b /src/comp/front/parser.rs | |
| parent | Typecheck tags in "alt" patterns (diff) | |
| download | rust-699ef987d78db9d74a2f4e3e5849355998d7b407.tar.xz rust-699ef987d78db9d74a2f4e3e5849355998d7b407.zip | |
rustc: Start work on lvals
Diffstat (limited to 'src/comp/front/parser.rs')
| -rw-r--r-- | src/comp/front/parser.rs | 52 |
1 files changed, 37 insertions, 15 deletions
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)); } } } |