about summary refs log tree commit diff
path: root/src/comp/syntax/parse
diff options
context:
space:
mode:
authorErick Tryzelaar <erick.tryzelaar@gmail.com>2011-08-16 09:07:26 -0700
committerErick Tryzelaar <erick.tryzelaar@gmail.com>2011-08-16 14:16:14 -0700
commit0107d6a81d2180d3a1e070e982e346038195cada (patch)
tree28e29a252d82ad5d247c83572bd4fa8b521a5e74 /src/comp/syntax/parse
parent6e06893819eeafaa5c5b1518a8d809c211ce8519 (diff)
downloadrust-0107d6a81d2180d3a1e070e982e346038195cada.tar.gz
rust-0107d6a81d2180d3a1e070e982e346038195cada.zip
Change type parameter syntax to foo<T>.
This preserves the old syntax for now.
Diffstat (limited to 'src/comp/syntax/parse')
-rw-r--r--src/comp/syntax/parse/parser.rs67
1 files changed, 57 insertions, 10 deletions
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs
index 780d67b4b27..b1a4a92373d 100644
--- a/src/comp/syntax/parse/parser.rs
+++ b/src/comp/syntax/parse/parser.rs
@@ -35,6 +35,7 @@ type parser =
     obj {
         fn peek() -> token::token ;
         fn bump() ;
+        fn swap(token::token, uint, uint) ;
         fn look_ahead(uint) -> token::token ;
         fn fatal(str) -> !  ;
         fn warn(str) ;
@@ -97,6 +98,10 @@ fn new_parser(sess: parse_sess, cfg: ast::crate_cfg, rdr: lexer::reader,
                 tok_span = next.span;
             }
         }
+        fn swap(next: token::token, lo: uint, hi: uint) {
+            tok = next;
+            tok_span = ast::mk_sp(lo, hi);
+        }
         fn look_ahead(distance: uint) -> token::token {
             while vec::len(buffer) < distance {
                 let next = lexer::next_token(rdr);
@@ -202,6 +207,23 @@ fn expect(p: &parser, t: token::token) {
     }
 }
 
+fn expect_gt(p: &parser) {
+    if p.peek() == token::GT {
+        p.bump();
+    } else if p.peek() == token::BINOP(token::LSR) {
+        p.swap(token::GT, p.get_lo_pos() + 1u, p.get_hi_pos());
+    } else if p.peek() == token::BINOP(token::ASR) {
+        p.swap(token::BINOP(token::LSR), p.get_lo_pos() + 1u,
+               p.get_hi_pos());
+    } else {
+        let s: str = "expecting ";
+        s += token::to_str(p.get_reader(), token::GT);
+        s += ", found ";
+        s += token::to_str(p.get_reader(), p.peek());
+        p.fatal(s);
+    }
+}
+
 fn spanned[T](lo: uint, hi: uint, node: &T) -> spanned[T] {
     ret {node: node, span: ast::mk_sp(lo, hi)};
 }
@@ -426,24 +448,23 @@ fn parse_ty_postfix(orig_t: ast::ty_, p: &parser, colons_before_params: bool)
         -> @ast::ty {
     let lo = p.get_lo_pos();
 
-    let end;
+    let seq;
     if p.peek() == token::LBRACKET {
         p.bump();
-        end = token::RBRACKET;
+        seq = parse_seq_to_end(token::RBRACKET, some(token::COMMA),
+                               bind parse_ty(_, false), p);
     } else if colons_before_params && p.peek() == token::MOD_SEP {
         p.bump();
         expect(p, token::LT);
-        end = token::GT;
+        seq = parse_seq_to_gt(some(token::COMMA), bind parse_ty(_, false), p);
     } else if !colons_before_params && p.peek() == token::LT {
         p.bump();
-        end = token::GT;
+        seq = parse_seq_to_gt(some(token::COMMA), bind parse_ty(_, false), p);
     } else {
         ret @spanned(lo, p.get_lo_pos(), orig_t);
     }
 
     // If we're here, we have explicit type parameter instantiation.
-    let seq = parse_seq_to_end(end, some(token::COMMA),
-                               bind parse_ty(_, false), p);
 
     alt orig_t {
       ast::ty_path(pth, ann) {
@@ -554,10 +575,17 @@ fn parse_ty(p: &parser, colons_before_params: bool) -> @ast::ty {
                                parse_type_constraints(p));
         }
     } else if (eat_word(p, "vec")) {
-        expect(p, token::LBRACKET);
-        t = ast::ty_vec(parse_mt(p));
-        hi = p.get_hi_pos();
-        expect(p, token::RBRACKET);
+        if p.peek() == token::LBRACKET {
+            p.bump();
+            t = ast::ty_vec(parse_mt(p));
+            hi = p.get_hi_pos();
+            expect(p, token::RBRACKET);
+        } else {
+            expect(p, token::LT);
+            t = ast::ty_vec(parse_mt(p));
+            hi = p.get_hi_pos();
+            expect_gt(p);
+        }
     } else if (p.peek() == token::LBRACKET) {
         expect(p, token::LBRACKET);
         t = ast::ty_ivec(parse_mt(p));
@@ -615,6 +643,25 @@ fn parse_fn_block_arg(p: &parser) -> ast::arg {
     ret {mode: m, ty: t, ident: i, id: p.get_id()};
 }
 
+fn parse_seq_to_gt[T](sep: option::t[token::token], f: fn(&parser) -> T,
+                      p: &parser) -> [T] {
+    let first = true;
+    let v = ~[];
+    while p.peek() != token::GT &&
+          p.peek() != token::BINOP(token::LSR) &&
+          p.peek() != token::BINOP(token::ASR) {
+        alt sep {
+          some(t) { if first { first = false; } else { expect(p, t); } }
+          _ { }
+        }
+        v += ~[f(p)];
+    }
+
+    expect_gt(p);
+
+    ret v;
+}
+
 fn parse_seq_to_end[T](ket: token::token, sep: option::t[token::token],
                        f: fn(&parser) -> T , p: &parser) -> [T] {
     let val = parse_seq_to_before_end(ket, sep, f, p);