From bdb206f2855cc6f7d3d79379633f7429b7327fec Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 14 Aug 2012 19:20:56 -0700 Subject: rustc: Parse labeled loop, break, and again --- src/libsyntax/parse/classify.rs | 2 +- src/libsyntax/parse/parser.rs | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) (limited to 'src/libsyntax/parse') diff --git a/src/libsyntax/parse/classify.rs b/src/libsyntax/parse/classify.rs index d8ae8044370..1fd9dc2c23c 100644 --- a/src/libsyntax/parse/classify.rs +++ b/src/libsyntax/parse/classify.rs @@ -7,7 +7,7 @@ import ast_util::operator_prec; fn expr_requires_semi_to_be_stmt(e: @ast::expr) -> bool { match e.node { ast::expr_if(_, _, _) | ast::expr_match(_, _, _) | ast::expr_block(_) - | ast::expr_while(_, _) | ast::expr_loop(_) + | ast::expr_while(_, _) | ast::expr_loop(_, _) | ast::expr_call(_, _, true) => false, _ => true } diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 642cdaa8fab..977e75362f8 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -939,10 +939,18 @@ class parser { ex = expr_ret(some(e)); } else { ex = expr_ret(none); } } else if self.eat_keyword(~"break") { - ex = expr_break; + if is_ident(self.token) { + ex = expr_break(some(self.parse_ident())); + } else { + ex = expr_break(none); + } hi = self.span.hi; } else if self.eat_keyword(~"again") { - ex = expr_again; + if is_ident(self.token) { + ex = expr_again(some(self.parse_ident())); + } else { + ex = expr_again(none); + } hi = self.span.hi; } else if self.eat_keyword(~"copy") { let e = self.parse_expr(); @@ -1585,10 +1593,18 @@ class parser { } fn parse_loop_expr() -> @expr { + let opt_ident; + if is_ident(self.token) { + opt_ident = some(self.parse_ident()); + self.expect(token::COLON); + } else { + opt_ident = none; + } + let lo = self.last_span.lo; let body = self.parse_block_no_value(); let mut hi = body.span.hi; - return self.mk_expr(lo, hi, expr_loop(body)); + return self.mk_expr(lo, hi, expr_loop(body, opt_ident)); } // For distingishing between record literals and blocks -- cgit 1.4.1-3-g733a5