diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2012-02-07 06:37:08 -0800 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2012-02-11 10:14:41 -0800 |
| commit | b106ef81164a33e2f18820274b48cb9673c423af (patch) | |
| tree | 7b0fe347c80af1cdbc84df5b24290791c222e0fc /src/comp/syntax/parse | |
| parent | fc023d91c77f468211ba9f7681b4d2a6469aac74 (diff) | |
| download | rust-b106ef81164a33e2f18820274b48cb9673c423af.tar.gz rust-b106ef81164a33e2f18820274b48cb9673c423af.zip | |
make bind syntax unnecessary: just use _ for one of the arguments
Diffstat (limited to 'src/comp/syntax/parse')
| -rw-r--r-- | src/comp/syntax/parse/parser.rs | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs index 8e2897407a3..3ce4d38013e 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -854,15 +854,9 @@ fn parse_bottom_expr(p: parser) -> pexpr { ret pexpr(mk_mac_expr(p, lo, p.span.hi, ast::mac_ellipsis)); } else if eat_word(p, "bind") { let e = parse_expr_res(p, RESTRICT_NO_CALL_EXPRS); - fn parse_expr_opt(p: parser) -> option<@ast::expr> { - alt p.token { - token::UNDERSCORE { p.bump(); ret none; } - _ { ret some(parse_expr(p)); } - } - } let es = parse_seq(token::LPAREN, token::RPAREN, seq_sep(token::COMMA), - parse_expr_opt, p); + parse_expr_or_hole, p); hi = es.span.hi; ex = ast::expr_bind(e, es.node); } else if p.token == token::POUND { @@ -1036,10 +1030,18 @@ fn parse_dot_or_call_expr_with(p: parser, e0: pexpr) -> pexpr { alt p.token { // expr(...) token::LPAREN if permits_call(p) { - let es = parse_seq(token::LPAREN, token::RPAREN, - seq_sep(token::COMMA), parse_expr, p); - hi = es.span.hi; - let nd = ast::expr_call(to_expr(e), es.node, false); + let es_opt = + parse_seq(token::LPAREN, token::RPAREN, + seq_sep(token::COMMA), parse_expr_or_hole, p); + hi = es_opt.span.hi; + + let nd = + if vec::any(es_opt.node, {|e| option::is_none(e) }) { + ast::expr_bind(to_expr(e), es_opt.node) + } else { + let es = vec::map(es_opt.node) {|e| option::get(e) }; + ast::expr_call(to_expr(e), es, false) + }; e = mk_pexpr(p, lo, hi, nd); } @@ -1388,6 +1390,13 @@ fn parse_expr(p: parser) -> @ast::expr { ret parse_expr_res(p, UNRESTRICTED); } +fn parse_expr_or_hole(p: parser) -> option<@ast::expr> { + alt p.token { + token::UNDERSCORE { p.bump(); ret none; } + _ { ret some(parse_expr(p)); } + } +} + fn parse_expr_res(p: parser, r: restriction) -> @ast::expr { let old = p.restriction; p.restriction = r; |
