aboutsummaryrefslogtreecommitdiff
path: root/src/comp/front
diff options
context:
space:
mode:
authorBrian Anderson <[email protected]>2011-01-31 23:06:02 -0500
committerBrian Anderson <[email protected]>2011-02-01 00:08:47 -0500
commit3fedb18c0af0bd9fa5e4973936003c0b57e4d3e8 (patch)
tree69adf95963fda1fedd3338d30f095f73d1c37c77 /src/comp/front
parentMerge branch 'master' into forgraydon-elseif (diff)
downloadrust-3fedb18c0af0bd9fa5e4973936003c0b57e4d3e8.tar.xz
rust-3fedb18c0af0bd9fa5e4973936003c0b57e4d3e8.zip
Allow the else part of an expr_if to be either expr_if or expr_block
Diffstat (limited to 'src/comp/front')
-rw-r--r--src/comp/front/ast.rs2
-rw-r--r--src/comp/front/parser.rs19
2 files changed, 10 insertions, 11 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs
index 10bcd5c4..fb068dba 100644
--- a/src/comp/front/ast.rs
+++ b/src/comp/front/ast.rs
@@ -149,7 +149,7 @@ tag expr_ {
expr_unary(unop, @expr, ann);
expr_lit(@lit, ann);
expr_cast(@expr, @ty, ann);
- expr_if(@expr, block, option.t[block], ann);
+ expr_if(@expr, block, option.t[@expr], ann);
expr_while(@expr, block, ann);
expr_for(@decl, @expr, block, ann);
expr_do_while(block, @expr, ann);
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index fbed877f..e629683c 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -891,30 +891,29 @@ impure fn parse_if_expr(parser p) -> @ast.expr {
auto cond = parse_expr(p);
expect(p, token.RPAREN);
auto thn = parse_block(p);
- let option.t[ast.block] els = none[ast.block];
+ let option.t[@ast.expr] els = none[@ast.expr];
hi = thn.span;
alt (p.peek()) {
case (token.ELSE) {
- auto eblk = parse_else_block(p);
- els = some(eblk);
- hi = eblk.span;
+ auto elexpr = parse_else_expr(p);
+ els = some(elexpr);
+ hi = elexpr.span;
}
case (_) { /* fall through */ }
}
ret @spanned(lo, hi, ast.expr_if(cond, thn, els, ast.ann_none));
}
-impure fn parse_else_block(parser p) -> ast.block {
+impure fn parse_else_expr(parser p) -> @ast.expr {
expect(p, token.ELSE);
alt (p.peek()) {
case (token.IF) {
- let vec[@ast.stmt] stmts = vec();
- auto ifexpr = parse_if_expr(p);
- auto bloc = index_block(stmts, some(ifexpr));
- ret spanned(ifexpr.span, ifexpr.span, bloc);
+ ret parse_if_expr(p);
}
case (_) {
- ret parse_block(p);
+ auto blk = parse_block(p);
+ ret @spanned(blk.span, blk.span,
+ ast.expr_block(blk, ast.ann_none));
}
}
}