aboutsummaryrefslogtreecommitdiff
path: root/src/comp/front/parser.rs
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-11-03 11:05:15 -0700
committerGraydon Hoare <[email protected]>2010-11-03 11:05:15 -0700
commite5fdd7b63a7365df015c9d08111a8f635b25e058 (patch)
treedaa0b7450779173d9eceed343e038424799b645d /src/comp/front/parser.rs
parentTeach rustc lexer about changes to stratum, opacity and effect keywords. (diff)
downloadrust-e5fdd7b63a7365df015c9d08111a8f635b25e058.tar.xz
rust-e5fdd7b63a7365df015c9d08111a8f635b25e058.zip
Support while and do-while loops in rustc.
Diffstat (limited to 'src/comp/front/parser.rs')
-rw-r--r--src/comp/front/parser.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index fd3bd1c0..7046f4b0 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -613,6 +613,33 @@ impure fn parse_if_expr(parser p) -> @ast.expr {
ret @spanned(lo, hi, ast.expr_if(cond, thn, els, none[@ast.ty]));
}
+impure fn parse_while_expr(parser p) -> @ast.expr {
+ auto lo = p.get_span();
+ auto hi = lo;
+
+ expect(p, token.WHILE);
+ expect (p, token.LPAREN);
+ auto cond = parse_expr(p);
+ expect(p, token.RPAREN);
+ auto body = parse_block(p);
+ hi = body.span;
+ ret @spanned(lo, hi, ast.expr_while(cond, body, none[@ast.ty]));
+}
+
+impure fn parse_do_while_expr(parser p) -> @ast.expr {
+ auto lo = p.get_span();
+ auto hi = lo;
+
+ expect(p, token.DO);
+ auto body = parse_block(p);
+ expect(p, token.WHILE);
+ expect (p, token.LPAREN);
+ auto cond = parse_expr(p);
+ expect(p, token.RPAREN);
+ hi = cond.span;
+ ret @spanned(lo, hi, ast.expr_do_while(body, cond, none[@ast.ty]));
+}
+
impure fn parse_expr(parser p) -> @ast.expr {
alt (p.peek()) {
case (token.LBRACE) {
@@ -623,6 +650,12 @@ impure fn parse_expr(parser p) -> @ast.expr {
case (token.IF) {
ret parse_if_expr(p);
}
+ case (token.WHILE) {
+ ret parse_while_expr(p);
+ }
+ case (token.DO) {
+ ret parse_do_while_expr(p);
+ }
case (_) {
ret parse_assign_expr(p);
}
@@ -741,6 +774,16 @@ impure fn parse_stmt(parser p) -> @ast.stmt {
ret @spanned(lo, e.span, ast.stmt_expr(e));
}
+ case (token.WHILE) {
+ auto e = parse_expr(p);
+ ret @spanned(lo, e.span, ast.stmt_expr(e));
+ }
+
+ case (token.DO) {
+ auto e = parse_expr(p);
+ ret @spanned(lo, e.span, ast.stmt_expr(e));
+ }
+
case (token.LBRACE) {
auto e = parse_expr(p);
ret @spanned(lo, e.span, ast.stmt_expr(e));