@@ -1456,96 +1456,105 @@ pub impl Parser {
1456
1456
return self.mk_expr(lo, hi, ex);
1457
1457
}
1458
1458
1459
-
1459
+ // parse an expression of binops
1460
1460
fn parse_binops() -> @expr {
1461
- return self.parse_more_binops(self.parse_prefix_expr(), 0);
1461
+ self.parse_more_binops(self.parse_prefix_expr(), 0)
1462
1462
}
1463
1463
1464
+ // parse an expression of binops of at least min_prec precedence
1464
1465
fn parse_more_binops(lhs: @expr, min_prec: uint) ->
1465
1466
@expr {
1466
1467
if self.expr_is_complete(lhs) { return lhs; }
1467
1468
let peeked = self.token;
1468
1469
if peeked == token::BINOP(token::OR) &&
1469
1470
(self.restriction == RESTRICT_NO_BAR_OP ||
1470
1471
self.restriction == RESTRICT_NO_BAR_OR_DOUBLEBAR_OP) {
1471
- return lhs;
1472
- }
1473
- if peeked == token::OROR &&
1472
+ lhs
1473
+ } else if peeked == token::OROR &&
1474
1474
self.restriction == RESTRICT_NO_BAR_OR_DOUBLEBAR_OP {
1475
- return lhs;
1476
- }
1477
- let cur_opt = token_to_binop(peeked);
1478
- match cur_opt {
1479
- Some(cur_op) => {
1480
- let cur_prec = operator_prec(cur_op);
1481
- if cur_prec > min_prec {
1482
- self.bump();
1483
- let expr = self.parse_prefix_expr();
1484
- let rhs = self.parse_more_binops(expr, cur_prec);
1485
- self.get_id(); // see ast_util::op_expr_callee_id
1486
- let bin = self.mk_expr(lhs.span.lo, rhs.span.hi,
1487
- expr_binary(cur_op, lhs, rhs));
1488
- return self.parse_more_binops(bin, min_prec);
1475
+ lhs
1476
+ } else {
1477
+ let cur_opt = token_to_binop(peeked);
1478
+ match cur_opt {
1479
+ Some(cur_op) => {
1480
+ let cur_prec = operator_prec(cur_op);
1481
+ if cur_prec > min_prec {
1482
+ self.bump();
1483
+ let expr = self.parse_prefix_expr();
1484
+ let rhs = self.parse_more_binops(expr, cur_prec);
1485
+ self.get_id(); // see ast_util::op_expr_callee_id
1486
+ let bin = self.mk_expr(lhs.span.lo, rhs.span.hi,
1487
+ expr_binary(cur_op, lhs, rhs));
1488
+ self.parse_more_binops(bin, min_prec)
1489
+ } else {
1490
+ lhs
1491
+ }
1492
+ }
1493
+ None => {
1494
+ if as_prec > min_prec && self.eat_keyword(~" as ") {
1495
+ let rhs = self.parse_ty(true);
1496
+ let _as = self.mk_expr(lhs.span.lo,
1497
+ rhs.span.hi,
1498
+ expr_cast(lhs, rhs));
1499
+ self.parse_more_binops(_as, min_prec)
1500
+ } else {
1501
+ lhs
1502
+ }
1503
+ }
1489
1504
}
1490
- }
1491
- _ => ()
1492
- }
1493
- if as_prec > min_prec && self.eat_keyword(~" as ") {
1494
- let rhs = self.parse_ty(true);
1495
- let _as =
1496
- self.mk_expr(lhs.span.lo, rhs.span.hi, expr_cast(lhs, rhs));
1497
- return self.parse_more_binops(_as, min_prec);
1498
1505
}
1499
- return lhs;
1500
1506
}
1501
1507
1502
- // parse an arbitrary expression.
1508
+ // parse an assignment expression....
1509
+ // actually, this seems to be the main entry point for
1510
+ // parsing an arbitrary expression.
1503
1511
fn parse_assign_expr() -> @expr {
1504
1512
let lo = self.span.lo;
1505
1513
let lhs = self.parse_binops();
1506
1514
match copy self.token {
1507
- token::EQ => {
1508
- self.bump();
1509
- let rhs = self.parse_expr();
1510
- return self.mk_expr(lo, rhs.span.hi, expr_assign(lhs, rhs));
1515
+ token::EQ => {
1516
+ self.bump();
1517
+ let rhs = self.parse_expr();
1518
+ self.mk_expr(lo, rhs.span.hi, expr_assign(lhs, rhs))
1511
1519
}
1512
1520
token::BINOPEQ(op) => {
1513
- self.bump();
1514
- let rhs = self.parse_expr();
1515
- let mut aop;
1516
- match op {
1517
- token::PLUS => aop = add,
1518
- token::MINUS => aop = subtract,
1519
- token::STAR => aop = mul,
1520
- token::SLASH => aop = div,
1521
- token::PERCENT => aop = rem,
1522
- token::CARET => aop = bitxor,
1523
- token::AND => aop = bitand,
1524
- token::OR => aop = bitor,
1525
- token::SHL => aop = shl,
1526
- token::SHR => aop = shr
1527
- }
1528
- self.get_id(); // see ast_util::op_expr_callee_id
1529
- return self.mk_expr(lo, rhs.span.hi,
1530
- expr_assign_op(aop, lhs, rhs));
1521
+ self.bump();
1522
+ let rhs = self.parse_expr();
1523
+ let mut aop;
1524
+ match op {
1525
+ token::PLUS => aop = add,
1526
+ token::MINUS => aop = subtract,
1527
+ token::STAR => aop = mul,
1528
+ token::SLASH => aop = div,
1529
+ token::PERCENT => aop = rem,
1530
+ token::CARET => aop = bitxor,
1531
+ token::AND => aop = bitand,
1532
+ token::OR => aop = bitor,
1533
+ token::SHL => aop = shl,
1534
+ token::SHR => aop = shr
1535
+ }
1536
+ self.get_id(); // see ast_util::op_expr_callee_id
1537
+ self.mk_expr(lo, rhs.span.hi,
1538
+ expr_assign_op(aop, lhs, rhs))
1531
1539
}
1532
1540
token::LARROW => {
1533
1541
self.obsolete(copy self.span, ObsoleteBinaryMove);
1534
1542
// Bogus value (but it's an error)
1535
1543
self.bump(); // <-
1536
1544
self.bump(); // rhs
1537
1545
self.bump(); // ;
1538
- return self.mk_expr(lo, self.span.hi,
1539
- expr_break(None));
1546
+ self.mk_expr(lo, self.span.hi,
1547
+ expr_break(None))
1540
1548
}
1541
1549
token::DARROW => {
1542
1550
self.bump();
1543
1551
let rhs = self.parse_expr();
1544
- return self.mk_expr(lo, rhs.span.hi, expr_swap(lhs, rhs));
1552
+ self.mk_expr(lo, rhs.span.hi, expr_swap(lhs, rhs))
1553
+ }
1554
+ _ => {
1555
+ lhs
1545
1556
}
1546
- _ => {/* fall through */ }
1547
1557
}
1548
- return lhs;
1549
1558
}
1550
1559
1551
1560
fn parse_if_expr() -> @expr {
@@ -1560,7 +1569,7 @@ pub impl Parser {
1560
1569
hi = elexpr.span.hi;
1561
1570
}
1562
1571
let q = {cond: cond, then: thn, els: els, lo: lo, hi: hi};
1563
- return self .mk_expr(q.lo, q.hi, expr_if(q.cond, q.then, q.els));
1572
+ f .mk_expr(q.lo, q.hi, expr_if(q.cond, q.then, q.els))
1564
1573
}
1565
1574
1566
1575
fn parse_fn_expr(proto: Proto) -> @expr {
@@ -1571,8 +1580,9 @@ pub impl Parser {
1571
1580
let decl = self.parse_fn_decl(|p| p.parse_arg_or_capture_item());
1572
1581
1573
1582
let body = self.parse_block();
1574
- return self.mk_expr(lo, body.span.hi,
1575
- expr_fn(proto, decl, body, @()));
1583
+
1584
+ self.mk_expr(lo, body.span.hi,
1585
+ expr_fn(proto, decl, body, capture_clause));
1576
1586
}
1577
1587
1578
1588
// `|args| { ... }` like in `do` expressions
0 commit comments