diff options
Diffstat (limited to 'src/comp/syntax/parse')
| -rw-r--r-- | src/comp/syntax/parse/parser.rs | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs index 78e9ec160ed..8db9a068bbe 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -591,6 +591,24 @@ fn parse_seq_to_end[T](token::token ket, option::t[token::token] sep, ret v; } +fn parse_seq_to_end_ivec[T](token::token ket, option::t[token::token] sep, + fn(&parser)->T f, &parser p) -> T[] { + let bool first = true; + let T[] v = ~[]; + while (p.peek() != ket) { + alt (sep) { + case (some(?t)) { + if (first) { first = false; } else { expect(p, t); } + } + case (_) { } + } + v += ~[f(p)]; + } + expect(p, ket); + ret v; +} + + fn parse_seq[T](token::token bra, token::token ket, option::t[token::token] sep, fn(&parser) -> T f, &parser p) -> ast::spanned[vec[T]] { @@ -601,6 +619,17 @@ fn parse_seq[T](token::token bra, token::token ket, ret spanned(lo, hi, result); } +fn parse_seq_ivec[T](token::token bra, token::token ket, + option::t[token::token] sep, + fn(&parser)->T f, &parser p) -> ast::spanned[T[]] { + auto lo = p.get_lo_pos(); + expect(p, bra); + auto result = parse_seq_to_end_ivec[T](ket, sep, f, p); + auto hi = p.get_hi_pos(); + ret spanned(lo, hi, result); +} + + fn parse_lit(&parser p) -> ast::lit { auto sp = p.get_span(); let ast::lit_ lit = ast::lit_nil; @@ -2186,15 +2215,15 @@ fn parse_meta_item(&parser p) -> @ast::meta_item { } } -fn parse_meta_seq(&parser p) -> vec[@ast::meta_item] { - ret parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA), - parse_meta_item, p).node; +fn parse_meta_seq(&parser p) -> (@ast::meta_item)[] { + ret parse_seq_ivec(token::LPAREN, token::RPAREN, some(token::COMMA), + parse_meta_item, p).node; } -fn parse_optional_meta(&parser p) -> vec[@ast::meta_item] { +fn parse_optional_meta(&parser p) -> (@ast::meta_item)[] { alt (p.peek()) { case (token::LPAREN) { ret parse_meta_seq(p); } - case (_) { let vec[@ast::meta_item] v = []; ret v; } + case (_) { ret ~[]; } } } @@ -2204,8 +2233,7 @@ fn parse_use(&parser p) -> @ast::view_item { auto metadata = parse_optional_meta(p); auto hi = p.get_hi_pos(); expect(p, token::SEMI); - auto use_decl = - ast::view_item_use(ident, metadata, p.get_id()); + auto use_decl = ast::view_item_use(ident, metadata, p.get_id()); ret @spanned(lo, hi, use_decl); } |
