Skip to content

Commit 25f879b

Browse files
committed
---
yaml --- r: 4731 b: refs/heads/master c: 0107d6a h: refs/heads/master i: 4729: db7a6ca 4727: e6805d1 v: v3
1 parent da08edf commit 25f879b

File tree

3 files changed

+65
-18
lines changed

3 files changed

+65
-18
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 6e06893819eeafaa5c5b1518a8d809c211ce8519
2+
refs/heads/master: 0107d6a81d2180d3a1e070e982e346038195cada

trunk/src/comp/syntax/parse/parser.rs

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type parser =
3535
obj {
3636
fn peek() -> token::token ;
3737
fn bump() ;
38+
fn swap(token::token, uint, uint) ;
3839
fn look_ahead(uint) -> token::token ;
3940
fn fatal(str) -> ! ;
4041
fn warn(str) ;
@@ -97,6 +98,10 @@ fn new_parser(sess: parse_sess, cfg: ast::crate_cfg, rdr: lexer::reader,
9798
tok_span = next.span;
9899
}
99100
}
101+
fn swap(next: token::token, lo: uint, hi: uint) {
102+
tok = next;
103+
tok_span = ast::mk_sp(lo, hi);
104+
}
100105
fn look_ahead(distance: uint) -> token::token {
101106
while vec::len(buffer) < distance {
102107
let next = lexer::next_token(rdr);
@@ -202,6 +207,23 @@ fn expect(p: &parser, t: token::token) {
202207
}
203208
}
204209

210+
fn expect_gt(p: &parser) {
211+
if p.peek() == token::GT {
212+
p.bump();
213+
} else if p.peek() == token::BINOP(token::LSR) {
214+
p.swap(token::GT, p.get_lo_pos() + 1u, p.get_hi_pos());
215+
} else if p.peek() == token::BINOP(token::ASR) {
216+
p.swap(token::BINOP(token::LSR), p.get_lo_pos() + 1u,
217+
p.get_hi_pos());
218+
} else {
219+
let s: str = "expecting ";
220+
s += token::to_str(p.get_reader(), token::GT);
221+
s += ", found ";
222+
s += token::to_str(p.get_reader(), p.peek());
223+
p.fatal(s);
224+
}
225+
}
226+
205227
fn spanned[T](lo: uint, hi: uint, node: &T) -> spanned[T] {
206228
ret {node: node, span: ast::mk_sp(lo, hi)};
207229
}
@@ -426,24 +448,23 @@ fn parse_ty_postfix(orig_t: ast::ty_, p: &parser, colons_before_params: bool)
426448
-> @ast::ty {
427449
let lo = p.get_lo_pos();
428450

429-
let end;
451+
let seq;
430452
if p.peek() == token::LBRACKET {
431453
p.bump();
432-
end = token::RBRACKET;
454+
seq = parse_seq_to_end(token::RBRACKET, some(token::COMMA),
455+
bind parse_ty(_, false), p);
433456
} else if colons_before_params && p.peek() == token::MOD_SEP {
434457
p.bump();
435458
expect(p, token::LT);
436-
end = token::GT;
459+
seq = parse_seq_to_gt(some(token::COMMA), bind parse_ty(_, false), p);
437460
} else if !colons_before_params && p.peek() == token::LT {
438461
p.bump();
439-
end = token::GT;
462+
seq = parse_seq_to_gt(some(token::COMMA), bind parse_ty(_, false), p);
440463
} else {
441464
ret @spanned(lo, p.get_lo_pos(), orig_t);
442465
}
443466

444467
// If we're here, we have explicit type parameter instantiation.
445-
let seq = parse_seq_to_end(end, some(token::COMMA),
446-
bind parse_ty(_, false), p);
447468

448469
alt orig_t {
449470
ast::ty_path(pth, ann) {
@@ -554,10 +575,17 @@ fn parse_ty(p: &parser, colons_before_params: bool) -> @ast::ty {
554575
parse_type_constraints(p));
555576
}
556577
} else if (eat_word(p, "vec")) {
557-
expect(p, token::LBRACKET);
558-
t = ast::ty_vec(parse_mt(p));
559-
hi = p.get_hi_pos();
560-
expect(p, token::RBRACKET);
578+
if p.peek() == token::LBRACKET {
579+
p.bump();
580+
t = ast::ty_vec(parse_mt(p));
581+
hi = p.get_hi_pos();
582+
expect(p, token::RBRACKET);
583+
} else {
584+
expect(p, token::LT);
585+
t = ast::ty_vec(parse_mt(p));
586+
hi = p.get_hi_pos();
587+
expect_gt(p);
588+
}
561589
} else if (p.peek() == token::LBRACKET) {
562590
expect(p, token::LBRACKET);
563591
t = ast::ty_ivec(parse_mt(p));
@@ -615,6 +643,25 @@ fn parse_fn_block_arg(p: &parser) -> ast::arg {
615643
ret {mode: m, ty: t, ident: i, id: p.get_id()};
616644
}
617645

646+
fn parse_seq_to_gt[T](sep: option::t[token::token], f: fn(&parser) -> T,
647+
p: &parser) -> [T] {
648+
let first = true;
649+
let v = ~[];
650+
while p.peek() != token::GT &&
651+
p.peek() != token::BINOP(token::LSR) &&
652+
p.peek() != token::BINOP(token::ASR) {
653+
alt sep {
654+
some(t) { if first { first = false; } else { expect(p, t); } }
655+
_ { }
656+
}
657+
v += ~[f(p)];
658+
}
659+
660+
expect_gt(p);
661+
662+
ret v;
663+
}
664+
618665
fn parse_seq_to_end[T](ket: token::token, sep: option::t[token::token],
619666
f: fn(&parser) -> T , p: &parser) -> [T] {
620667
let val = parse_seq_to_before_end(ket, sep, f, p);

trunk/src/comp/syntax/print/pprust.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ fn print_type(s: &ps, ty: &@ast::ty) {
282282
ast::ty_str. { word(s.s, "str"); }
283283
ast::ty_istr. { word(s.s, "istr"); }
284284
ast::ty_box(mt) { word(s.s, "@"); print_mt(s, mt); }
285-
ast::ty_vec(mt) { word(s.s, "vec["); print_mt(s, mt); word(s.s, "]"); }
285+
ast::ty_vec(mt) { word(s.s, "vec<"); print_mt(s, mt); word(s.s, ">"); }
286286
ast::ty_ivec(mt) {
287287
word(s.s, "[");
288288
alt mt.mut {
@@ -296,14 +296,14 @@ fn print_type(s: &ps, ty: &@ast::ty) {
296296
ast::ty_ptr(mt) { word(s.s, "*"); print_mt(s, mt); }
297297
ast::ty_task. { word(s.s, "task"); }
298298
ast::ty_port(t) {
299-
word(s.s, "port[");
299+
word(s.s, "port<");
300300
print_type(s, t);
301-
word(s.s, "]");
301+
word(s.s, ">");
302302
}
303303
ast::ty_chan(t) {
304-
word(s.s, "chan[");
304+
word(s.s, "chan<");
305305
print_type(s, t);
306-
word(s.s, "]");
306+
word(s.s, ">");
307307
}
308308
ast::ty_rec(fields) {
309309
word(s.s, "{");
@@ -1097,9 +1097,9 @@ fn print_path(s: &ps, path: &ast::path) {
10971097
word(s.s, id);
10981098
}
10991099
if vec::len(path.node.types) > 0u {
1100-
word(s.s, "[");
1100+
word(s.s, "<");
11011101
commasep(s, inconsistent, path.node.types, print_type);
1102-
word(s.s, "]");
1102+
word(s.s, ">");
11031103
}
11041104
}
11051105

0 commit comments

Comments
 (0)