@@ -27,33 +27,34 @@ import ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute,
27
27
expr_call, expr_cast, expr_copy, expr_do_body,
28
28
expr_fail, expr_field, expr_fn, expr_fn_block, expr_if,
29
29
expr_index, expr_lit, expr_log, expr_loop,
30
- expr_loop_body, expr_mac, expr_move, expr_path,
31
- expr_rec, expr_ret, expr_swap, expr_struct, expr_tup, expr_unary,
32
- expr_unary_move, expr_vec, expr_vstore, expr_while, extern_fn,
33
- field, fn_decl, foreign_item, foreign_item_fn, foreign_mod,
34
- ident, impure_fn, infer, inherited, init_assign, init_move,
35
- initializer, instance_var, item, item_, item_class, item_const,
36
- item_enum, item_fn, item_foreign_mod, item_impl, item_mac,
37
- item_mod, item_trait, item_ty, lit, lit_, lit_bool, lit_float,
38
- lit_int, lit_int_unsuffixed, lit_nil, lit_str, lit_uint, local,
39
- m_const, m_imm, m_mutbl, mac_, mac_aq, mac_ellipsis, mac_invoc,
40
- mac_invoc_tt, mac_var, matcher, match_nonterminal, match_seq,
41
- match_tok, method, mode, mt, mul, mutability, neg, noreturn, not,
42
- pat, pat_box, pat_enum, pat_ident, pat_lit, pat_range, pat_rec,
43
- pat_tup, pat_uniq, pat_wild, path, private, proto, proto_any,
44
- proto_bare, proto_block, proto_box, proto_uniq, provided, public,
45
- pure_fn, purity, re_anon, re_named, region, rem, required,
46
- ret_style, return_val, self_ty, shl, shr, stmt, stmt_decl,
47
- stmt_expr, stmt_semi, subtract, sty_box, sty_by_ref, sty_region,
48
- sty_uniq, sty_value, token_tree, trait_method, trait_ref,
49
- tt_delim, tt_seq, tt_tok, tt_nonterminal, ty, ty_, ty_bot,
50
- ty_box, ty_field, ty_fn, ty_infer, ty_mac, ty_method, ty_nil,
51
- ty_param, ty_path, ty_ptr, ty_rec, ty_rptr, ty_tup, ty_u32,
52
- ty_uniq, ty_vec, ty_fixed_length, unchecked_blk, uniq,
53
- unsafe_blk, unsafe_fn, variant, view_item, view_item_,
54
- view_item_export, view_item_import, view_item_use, view_path,
55
- view_path_glob, view_path_list, view_path_simple, visibility,
56
- vstore, vstore_box, vstore_fixed, vstore_slice, vstore_uniq} ;
30
+ expr_loop_body, expr_mac, expr_move, expr_path, expr_rec,
31
+ expr_repeat, expr_ret, expr_swap, expr_struct, expr_tup,
32
+ expr_unary, expr_unary_move, expr_vec, expr_vstore, expr_while,
33
+ extern_fn, field, fn_decl, foreign_item, foreign_item_fn,
34
+ foreign_mod, ident, impure_fn, infer, inherited, init_assign,
35
+ init_move, initializer, instance_var, item, item_, item_class,
36
+ item_const, item_enum, item_fn, item_foreign_mod, item_impl,
37
+ item_mac, item_mod, item_trait, item_ty, lit, lit_, lit_bool,
38
+ lit_float, lit_int, lit_int_unsuffixed, lit_nil, lit_str,
39
+ lit_uint, local, m_const, m_imm, m_mutbl, mac_, mac_aq,
40
+ mac_ellipsis, mac_invoc, mac_invoc_tt, mac_var, matcher,
41
+ match_nonterminal, match_seq, match_tok, method, mode, mt, mul,
42
+ mutability, neg, noreturn, not, pat, pat_box, pat_enum,
43
+ pat_ident, pat_lit, pat_range, pat_rec, pat_tup, pat_uniq,
44
+ pat_wild, path, private, proto, proto_any, proto_bare,
45
+ proto_block, proto_box, proto_uniq, provided, public, pure_fn,
46
+ purity, re_anon, re_named, region, rem, required, ret_style,
47
+ return_val, self_ty, shl, shr, stmt, stmt_decl, stmt_expr,
48
+ stmt_semi, subtract, sty_box, sty_by_ref, sty_region, sty_uniq,
49
+ sty_value, token_tree, trait_method, trait_ref, tt_delim, tt_seq,
50
+ tt_tok, tt_nonterminal, ty, ty_, ty_bot, ty_box, ty_field, ty_fn,
51
+ ty_infer, ty_mac, ty_method, ty_nil, ty_param, ty_path, ty_ptr,
52
+ ty_rec, ty_rptr, ty_tup, ty_u32, ty_uniq, ty_vec,
53
+ ty_fixed_length, unchecked_blk, uniq, unsafe_blk, unsafe_fn,
54
+ variant, view_item, view_item_, view_item_export,
55
+ view_item_import, view_item_use, view_path, view_path_glob,
56
+ view_path_list, view_path_simple, visibility, vstore, vstore_box,
57
+ vstore_fixed, vstore_slice, vstore_uniq} ;
57
58
58
59
export file_type;
59
60
export parser;
@@ -365,6 +366,7 @@ class parser {
365
366
// Parses something like "&x"
366
367
fn parse_region ( ) -> @region {
367
368
self . expect ( token:: BINOP ( token:: AND ) ) ;
369
+
368
370
alt copy self . token {
369
371
token:: IDENT ( sid, _) {
370
372
self . bump ( ) ;
@@ -812,11 +814,36 @@ class parser {
812
814
} else if self . token == token:: LBRACKET {
813
815
self . bump ( ) ;
814
816
let mutbl = self . parse_mutability ( ) ;
815
- let es = self . parse_seq_to_end (
816
- token:: RBRACKET , seq_sep_trailing_allowed ( token:: COMMA ) ,
817
- |p| p. parse_expr ( ) ) ;
817
+ if self . token == token:: RBRACKET {
818
+ // Empty vector.
819
+ self . bump ( ) ;
820
+ ex = expr_vec ( ~[ ] , mutbl) ;
821
+ } else {
822
+ // Nonempty vector.
823
+ let first_expr = self . parse_expr ( ) ;
824
+ if self . token == token:: COMMA &&
825
+ self . look_ahead ( 1 ) == token:: DOTDOT {
826
+ // Repeating vector syntax: [ 0, ..512 ]
827
+ self . bump ( ) ;
828
+ self . bump ( ) ;
829
+ let count = self . parse_expr ( ) ;
830
+ self . expect ( token:: RBRACKET ) ;
831
+ ex = expr_repeat ( first_expr, count, mutbl) ;
832
+ } else if self . token == token:: COMMA {
833
+ // Vector with two or more elements.
834
+ self . bump ( ) ;
835
+ let remaining_exprs =
836
+ self . parse_seq_to_end ( token:: RBRACKET ,
837
+ seq_sep_trailing_allowed ( token:: COMMA ) ,
838
+ |p| p. parse_expr ( ) ) ;
839
+ ex = expr_vec ( ~[ first_expr] + remaining_exprs, mutbl) ;
840
+ } else {
841
+ // Vector with one element.
842
+ self . expect ( token:: RBRACKET ) ;
843
+ ex = expr_vec ( ~[ first_expr] , mutbl) ;
844
+ }
845
+ }
818
846
hi = self . span . hi ;
819
- ex = expr_vec ( es, mutbl) ;
820
847
} else if self . token == token:: ELLIPSIS {
821
848
self . bump ( ) ;
822
849
return pexpr ( self . mk_mac_expr ( lo, self . span . hi , mac_ellipsis) ) ;
0 commit comments