aboutsummaryrefslogtreecommitdiff
path: root/src/comp/front
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-12-08 14:50:47 -0800
committerGraydon Hoare <[email protected]>2010-12-08 14:50:47 -0800
commit68af077e8192a6a1b18778b97449ad695a4ecffb (patch)
treed5a7bb274b328239429bdb0c40cf1675f01c3d1a /src/comp/front
parentFix missing case in resolve, un-XFAIL rec-tup.rs. (diff)
downloadrust-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.rs1
-rw-r--r--src/comp/front/lexer.rs2
-rw-r--r--src/comp/front/parser.rs22
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; }