From 214c32393a9d28436dd782c9ea6e3e32d3baba2e Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Sun, 30 Jan 2011 14:15:22 -0500 Subject: Teach rustc to parse 'else if' --- src/comp/front/parser.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'src/comp/front') diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index bef37a3c..fbed877f 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -895,8 +895,7 @@ impure fn parse_if_expr(parser p) -> @ast.expr { hi = thn.span; alt (p.peek()) { case (token.ELSE) { - p.bump(); - auto eblk = parse_block(p); + auto eblk = parse_else_block(p); els = some(eblk); hi = eblk.span; } @@ -905,6 +904,21 @@ impure fn parse_if_expr(parser p) -> @ast.expr { ret @spanned(lo, hi, ast.expr_if(cond, thn, els, ast.ann_none)); } +impure fn parse_else_block(parser p) -> ast.block { + 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); + } + case (_) { + ret parse_block(p); + } + } +} + impure fn parse_head_local(parser p) -> @ast.decl { auto lo = p.get_span(); let @ast.local local; -- cgit v1.2.3 From 3fedb18c0af0bd9fa5e4973936003c0b57e4d3e8 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 31 Jan 2011 23:06:02 -0500 Subject: Allow the else part of an expr_if to be either expr_if or expr_block --- src/comp/front/ast.rs | 2 +- src/comp/front/parser.rs | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) (limited to 'src/comp/front') 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)); } } } -- cgit v1.2.3