diff options
| author | Graydon Hoare <[email protected]> | 2010-11-03 11:05:15 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-11-03 11:05:15 -0700 |
| commit | e5fdd7b63a7365df015c9d08111a8f635b25e058 (patch) | |
| tree | daa0b7450779173d9eceed343e038424799b645d /src/comp/front/parser.rs | |
| parent | Teach rustc lexer about changes to stratum, opacity and effect keywords. (diff) | |
| download | rust-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.rs | 43 |
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)); |