diff options
| author | Graydon Hoare <[email protected]> | 2010-12-08 14:50:47 -0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-12-08 14:50:47 -0800 |
| commit | 68af077e8192a6a1b18778b97449ad695a4ecffb (patch) | |
| tree | d5a7bb274b328239429bdb0c40cf1675f01c3d1a /src/comp/front | |
| parent | Fix missing case in resolve, un-XFAIL rec-tup.rs. (diff) | |
| download | rust-68af077e8192a6a1b18778b97449ad695a4ecffb.tar.xz rust-68af077e8192a6a1b18778b97449ad695a4ecffb.zip | |
Implement binop= forms. Un-XFAIL bitwise.rs.
Diffstat (limited to 'src/comp/front')
| -rw-r--r-- | src/comp/front/ast.rs | 1 | ||||
| -rw-r--r-- | src/comp/front/lexer.rs | 2 | ||||
| -rw-r--r-- | src/comp/front/parser.rs | 22 |
3 files changed, 24 insertions, 1 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs index e7695e0b..a37fd191 100644 --- a/src/comp/front/ast.rs +++ b/src/comp/front/ast.rs @@ -145,6 +145,7 @@ tag expr_ { expr_alt(@expr, vec[arm], ann); 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_field(@expr, ident, ann); expr_index(@expr, @expr, ann); expr_name(name, option.t[def], ann); diff --git a/src/comp/front/lexer.rs b/src/comp/front/lexer.rs index 0506ce6c..42a5e610 100644 --- a/src/comp/front/lexer.rs +++ b/src/comp/front/lexer.rs @@ -426,7 +426,7 @@ impure fn next_token(reader rdr) -> token.token { impure fn binop(reader rdr, token.binop op) -> token.token { rdr.bump(); - if (rdr.next() == '=') { + if (rdr.curr() == '=') { rdr.bump(); ret token.BINOPEQ(op); } else { diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index 879cb2c0..d8d7ca4e 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -714,6 +714,26 @@ impure fn parse_assign_expr(parser p) -> @ast.expr { ret @spanned(lo, rhs.span, ast.expr_assign(lhs, rhs, ast.ann_none)); } + case (token.BINOPEQ(?op)) { + p.bump(); + auto rhs = parse_expr(p); + auto aop = ast.add; + alt (op) { + case (token.PLUS) { aop = ast.add; } + case (token.MINUS) { aop = ast.sub; } + case (token.STAR) { aop = ast.mul; } + case (token.SLASH) { aop = ast.div; } + case (token.PERCENT) { aop = ast.rem; } + case (token.CARET) { aop = ast.bitxor; } + case (token.AND) { aop = ast.bitand; } + case (token.OR) { aop = ast.bitor; } + case (token.LSL) { aop = ast.lsl; } + case (token.LSR) { aop = ast.lsr; } + case (token.ASR) { aop = ast.asr; } + } + ret @spanned(lo, rhs.span, + ast.expr_assign_op(aop, lhs, rhs, ast.ann_none)); + } case (_) { /* fall through */ } } ret lhs; @@ -1080,6 +1100,8 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool { case (ast.expr_alt(_,_,_)) { ret false; } case (ast.expr_block(_,_)) { ret false; } case (ast.expr_assign(_,_,_)) { ret true; } + case (ast.expr_assign_op(_,_,_,_)) + { ret true; } case (ast.expr_field(_,_,_)) { ret true; } case (ast.expr_index(_,_,_)) { ret true; } case (ast.expr_name(_,_,_)) { ret true; } |