Skip to content

Commit 906ca38

Browse files
lhtbrson
authored andcommitted
---
yaml --- r: 6435 b: refs/heads/master c: a936f78 h: refs/heads/master i: 6433: 3393f35 6431: b735893 v: v3
1 parent c575d10 commit 906ca38

File tree

4 files changed

+59
-31
lines changed

4 files changed

+59
-31
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: 901b9adb69fd55f72e0f71de7725f8aba3b7acb2
2+
refs/heads/master: a936f78d987debe7cb46a9ec13377cef76645cda

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

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ fn parse_ty_fn(proto: ast::proto, p: parser) -> ast::ty_ {
290290
ret spanned(lo, t.span.hi, {mode: mode, ty: t});
291291
}
292292
let inputs =
293-
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
293+
parse_seq(token::LPAREN, token::RPAREN, seq_sep(token::COMMA),
294294
parse_fn_input_ty, p);
295295
// FIXME: there's no syntax for this right now anyway
296296
// auto constrs = parse_constrs(~[], p);
@@ -319,7 +319,8 @@ fn parse_ty_obj(p: parser) -> ast::ty_ {
319319
}
320320
}
321321
let meths =
322-
parse_seq(token::LBRACE, token::RBRACE, none, parse_method_sig, p);
322+
parse_seq(token::LBRACE, token::RBRACE, seq_sep_none(),
323+
parse_method_sig, p);
323324
ret ast::ty_obj(meths.node);
324325
}
325326

@@ -376,7 +377,7 @@ fn parse_ty_constr(fn_args: [ast::arg], p: parser) -> @ast::constr {
376377
let lo = p.get_lo_pos();
377378
let path = parse_path(p);
378379
let args: {node: [@ast::constr_arg], span: span} =
379-
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
380+
parse_seq(token::LPAREN, token::RPAREN, seq_sep(token::COMMA),
380381
{|p| parse_constr_arg(fn_args, p)}, p);
381382
ret @spanned(lo, args.span.hi,
382383
{path: path, args: args.node, id: p.get_id()});
@@ -386,7 +387,7 @@ fn parse_constr_in_type(p: parser) -> @ast::ty_constr {
386387
let lo = p.get_lo_pos();
387388
let path = parse_path(p);
388389
let args: [@ast::ty_constr_arg] =
389-
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
390+
parse_seq(token::LPAREN, token::RPAREN, seq_sep(token::COMMA),
390391
parse_type_constr_arg, p).node;
391392
let hi = p.get_lo_pos();
392393
let tc: ast::ty_constr_ = {path: path, args: args, id: p.get_id()};
@@ -540,7 +541,7 @@ fn parse_ty(p: parser, colons_before_params: bool) -> @ast::ty {
540541
t = ast::ty_ptr(parse_mt(p));
541542
} else if p.peek() == token::LBRACE {
542543
let elems =
543-
parse_seq(token::LBRACE, token::RBRACE, some(token::COMMA),
544+
parse_seq(token::LBRACE, token::RBRACE, seq_sep_opt(token::COMMA),
544545
parse_ty_field, p);
545546
let hi = elems.span.hi;
546547
t = ast::ty_rec(elems.node);
@@ -631,31 +632,47 @@ fn parse_seq_lt_gt<copy T>(sep: option::t<token::token>,
631632
ret spanned(lo, hi, result);
632633
}
633634

634-
fn parse_seq_to_end<copy T>(ket: token::token, sep: option::t<token::token>,
635+
fn parse_seq_to_end<copy T>(ket: token::token, sep: seq_sep,
635636
f: block(parser) -> T, p: parser) -> [T] {
636637
let val = parse_seq_to_before_end(ket, sep, f, p);
637638
p.bump();
638639
ret val;
639640
}
640641

642+
type seq_sep = {
643+
sep: option::t<token::token>,
644+
trailing_opt: bool // is trailing separator optional?
645+
};
646+
647+
fn seq_sep(t: token::token) -> seq_sep {
648+
ret {sep: option::some(t), trailing_opt: false};
649+
}
650+
fn seq_sep_opt(t: token::token) -> seq_sep {
651+
ret {sep: option::some(t), trailing_opt: true};
652+
}
653+
fn seq_sep_none() -> seq_sep {
654+
ret {sep: option::none, trailing_opt: false};
655+
}
656+
641657
fn parse_seq_to_before_end<copy T>(ket: token::token,
642-
sep: option::t<token::token>,
658+
sep: seq_sep,
643659
f: block(parser) -> T, p: parser) -> [T] {
644660
let first: bool = true;
645661
let v: [T] = [];
646662
while p.peek() != ket {
647-
alt sep {
663+
alt sep.sep {
648664
some(t) { if first { first = false; } else { expect(p, t); } }
649665
_ { }
650666
}
667+
if sep.trailing_opt && p.peek() == ket { break; }
651668
v += [f(p)];
652669
}
653670
ret v;
654671
}
655672

656673

657674
fn parse_seq<copy T>(bra: token::token, ket: token::token,
658-
sep: option::t<token::token>, f: block(parser) -> T,
675+
sep: seq_sep, f: block(parser) -> T,
659676
p: parser) -> spanned<[T]> {
660677
let lo = p.get_lo_pos();
661678
expect(p, bra);
@@ -810,6 +827,10 @@ fn parse_bottom_expr(p: parser) -> @ast::expr {
810827
while p.peek() != token::RBRACE {
811828
if eat_word(p, "with") { base = some(parse_expr(p)); break; }
812829
expect(p, token::COMMA);
830+
if p.peek() == token::RBRACE {
831+
// record ends by an optional trailing comma
832+
break;
833+
}
813834
fields += [parse_field(p, token::COLON)];
814835
}
815836
hi = p.get_hi_pos();
@@ -850,8 +871,8 @@ fn parse_bottom_expr(p: parser) -> @ast::expr {
850871
p.bump();
851872
let mut = parse_mutability(p);
852873
let es =
853-
parse_seq_to_end(token::RBRACKET, some(token::COMMA), parse_expr,
854-
p);
874+
parse_seq_to_end(token::RBRACKET, seq_sep(token::COMMA),
875+
parse_expr, p);
855876
ex = ast::expr_vec(es, mut);
856877
} else if p.peek() == token::POUND_LT {
857878
p.bump();
@@ -876,7 +897,7 @@ fn parse_bottom_expr(p: parser) -> @ast::expr {
876897
if p.peek() == token::LPAREN {
877898
p.bump();
878899
fields =
879-
some(parse_seq_to_end(token::RPAREN, some(token::COMMA),
900+
some(parse_seq_to_end(token::RPAREN, seq_sep(token::COMMA),
880901
parse_anon_obj_field, p));
881902
}
882903
let meths: [@ast::method] = [];
@@ -906,7 +927,7 @@ fn parse_bottom_expr(p: parser) -> @ast::expr {
906927
}
907928
}
908929
let es =
909-
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
930+
parse_seq(token::LPAREN, token::RPAREN, seq_sep(token::COMMA),
910931
parse_expr_opt, p);
911932
hi = es.span.hi;
912933
ex = ast::expr_bind(e, es.node);
@@ -977,7 +998,7 @@ fn parse_bottom_expr(p: parser) -> @ast::expr {
977998
// The rest is a call expression.
978999
let f: @ast::expr = parse_self_method(p);
9791000
let es =
980-
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
1001+
parse_seq(token::LPAREN, token::RPAREN, seq_sep(token::COMMA),
9811002
parse_expr, p);
9821003
hi = es.span.hi;
9831004
ex = ast::expr_call(f, es.node, false);
@@ -1016,13 +1037,12 @@ fn parse_syntax_ext_naked(p: parser, lo: uint) -> @ast::expr {
10161037
p.fatal("expected a syntax expander name");
10171038
}
10181039
//temporary for a backwards-compatible cycle:
1040+
let sep = seq_sep(token::COMMA);
10191041
let es =
10201042
if p.peek() == token::LPAREN {
1021-
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
1022-
parse_expr, p)
1043+
parse_seq(token::LPAREN, token::RPAREN, sep, parse_expr, p)
10231044
} else {
1024-
parse_seq(token::LBRACKET, token::RBRACKET, some(token::COMMA),
1025-
parse_expr, p)
1045+
parse_seq(token::LBRACKET, token::RBRACKET, sep, parse_expr, p)
10261046
};
10271047
let hi = es.span.hi;
10281048
let e = mk_expr(p, es.span.lo, hi, ast::expr_vec(es.node, ast::imm));
@@ -1053,7 +1073,7 @@ fn parse_dot_or_call_expr_with(p: parser, e: @ast::expr) -> @ast::expr {
10531073
} else {
10541074
// Call expr.
10551075
let es = parse_seq(token::LPAREN, token::RPAREN,
1056-
some(token::COMMA), parse_expr, p);
1076+
seq_sep(token::COMMA), parse_expr, p);
10571077
hi = es.span.hi;
10581078
let nd = ast::expr_call(e, es.node, false);
10591079
e = mk_expr(p, lo, hi, nd);
@@ -1508,7 +1528,7 @@ fn parse_pat(p: parser) -> @ast::pat {
15081528
token::LPAREN. {
15091529
let a =
15101530
parse_seq(token::LPAREN, token::RPAREN,
1511-
some(token::COMMA), parse_pat, p);
1531+
seq_sep(token::COMMA), parse_pat, p);
15121532
args = a.node;
15131533
hi = a.span.hi;
15141534
}
@@ -1761,8 +1781,8 @@ fn parse_ty_params(p: parser) -> [ast::ty_param] {
17611781
fn parse_fn_decl(p: parser, purity: ast::purity, il: ast::inlineness) ->
17621782
ast::fn_decl {
17631783
let inputs: ast::spanned<[ast::arg]> =
1764-
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA), parse_arg,
1765-
p);
1784+
parse_seq(token::LPAREN, token::RPAREN, seq_sep(token::COMMA),
1785+
parse_arg, p);
17661786
// Use the args list to translate each bound variable
17671787
// mentioned in a constraint to an arg index.
17681788
// Seems weird to do this in the parser, but I'm not sure how else to.
@@ -1787,7 +1807,7 @@ fn parse_fn_block_decl(p: parser) -> ast::fn_decl {
17871807
[]
17881808
} else {
17891809
parse_seq(token::BINOP(token::OR), token::BINOP(token::OR),
1790-
some(token::COMMA), parse_fn_block_arg, p).node
1810+
seq_sep(token::COMMA), parse_fn_block_arg, p).node
17911811
};
17921812
ret {inputs: inputs,
17931813
output: @spanned(p.get_lo_pos(), p.get_hi_pos(), ast::ty_infer),
@@ -1861,7 +1881,7 @@ fn parse_item_obj(p: parser, attrs: [ast::attribute]) -> @ast::item {
18611881
let ident = parse_value_ident(p);
18621882
let ty_params = parse_ty_params(p);
18631883
let fields: ast::spanned<[ast::obj_field]> =
1864-
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
1884+
parse_seq(token::LPAREN, token::RPAREN, seq_sep(token::COMMA),
18651885
parse_obj_field, p);
18661886
let meths: [@ast::method] = [];
18671887
expect(p, token::LBRACE);
@@ -2066,7 +2086,7 @@ fn parse_item_tag(p: parser, attrs: [ast::attribute]) -> @ast::item {
20662086
alt p.peek() {
20672087
token::LPAREN. {
20682088
let arg_tys = parse_seq(token::LPAREN, token::RPAREN,
2069-
some(token::COMMA),
2089+
seq_sep(token::COMMA),
20702090
{|p| parse_ty(p, false)}, p);
20712091
for ty: @ast::ty in arg_tys.node {
20722092
args += [{ty: ty, id: p.get_id()}];
@@ -2258,7 +2278,7 @@ fn parse_meta_item(p: parser) -> @ast::meta_item {
22582278
}
22592279

22602280
fn parse_meta_seq(p: parser) -> [@ast::meta_item] {
2261-
ret parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
2281+
ret parse_seq(token::LPAREN, token::RPAREN, seq_sep(token::COMMA),
22622282
parse_meta_item, p).node;
22632283
}
22642284

@@ -2315,7 +2335,7 @@ fn parse_rest_import_name(p: parser, first: ast::ident,
23152335
ret spanned(lo, hi, {name: ident, id: p.get_id()});
23162336
}
23172337
let from_idents_ =
2318-
parse_seq(token::LBRACE, token::RBRACE, some(token::COMMA),
2338+
parse_seq(token::LBRACE, token::RBRACE, seq_sep(token::COMMA),
23192339
parse_import_ident, p).node;
23202340
if vec::is_empty(from_idents_) {
23212341
p.fatal("at least one import is required");
@@ -2385,7 +2405,7 @@ fn parse_import(p: parser) -> ast::view_item_ {
23852405

23862406
fn parse_export(p: parser) -> ast::view_item_ {
23872407
let ids =
2388-
parse_seq_to_before_end(token::SEMI, option::some(token::COMMA),
2408+
parse_seq_to_before_end(token::SEMI, seq_sep(token::COMMA),
23892409
parse_ident, p);
23902410
ret ast::view_item_export(ids, p.get_id());
23912411
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ fn print_type(s: ps, &&ty: @ast::ty) {
294294
}
295295
fn get_span(f: ast::ty_field) -> codemap::span { ret f.span; }
296296
commasep_cmnt(s, consistent, fields, print_field, get_span);
297-
word(s.s, "}");
297+
word(s.s, ",}");
298298
}
299299
ast::ty_tup(elts) {
300300
popen(s);
@@ -693,7 +693,7 @@ fn print_expr(s: ps, &&expr: @ast::expr) {
693693
print_expr(s, expr);
694694
end(s);
695695
}
696-
_ { }
696+
_ { word(s.s, ","); }
697697
}
698698
word(s.s, "}");
699699
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// pp-exact
2+
type thing = {x: int, y: int,};
3+
4+
fn main() {
5+
let sth = {x: 0, y: 1,};
6+
let sth2 = {y: 9 with sth};
7+
assert (sth.x + sth2.y == 9);
8+
}

0 commit comments

Comments
 (0)