@@ -155,6 +155,7 @@ fn bad_expr_word_table() -> hashmap[str, ()] {
155
155
words. insert ( "do" , ( ) ) ;
156
156
words. insert ( "alt" , ( ) ) ;
157
157
words. insert ( "for" , ( ) ) ;
158
+ words. insert ( "each" , ( ) ) ;
158
159
words. insert ( "break" , ( ) ) ;
159
160
words. insert ( "cont" , ( ) ) ;
160
161
words. insert ( "put" , ( ) ) ;
@@ -221,6 +222,11 @@ fn parse_value_ident(&parser p) -> ast::ident {
221
222
ret parse_ident ( p) ;
222
223
}
223
224
225
+ fn eat ( & parser p, & token:: token tok) -> bool {
226
+ ret if p. peek ( ) == tok { p. bump ( ) ; true }
227
+ else { false } ;
228
+ }
229
+
224
230
fn is_word ( & parser p, & str word ) -> bool {
225
231
ret alt ( p. peek ( ) ) {
226
232
case ( token:: IDENT ( ?sid, false ) ) { str:: eq ( word, p. get_str ( sid) ) }
@@ -262,16 +268,16 @@ fn check_bad_word(&parser p) {
262
268
fn parse_ty_fn ( ast:: proto proto, & parser p, uint lo) -> ast:: ty_ {
263
269
fn parse_fn_input_ty ( & parser p) -> ast:: ty_arg {
264
270
auto lo = p. get_lo_pos ( ) ;
271
+ // Ignore arg name, if present
272
+ if is_plain_ident ( p) && p. look_ahead ( 1 u) == token:: COLON {
273
+ p. bump ( ) ; p. bump ( ) ;
274
+ }
265
275
auto mode = ast:: val;
266
276
if ( p. peek ( ) == token:: BINOP ( token:: AND ) ) {
267
277
p. bump ( ) ;
268
278
mode = ast:: alias ( eat_word ( p, "mutable" ) ) ;
269
279
}
270
280
auto t = parse_ty ( p) ;
271
- alt ( p. peek ( ) ) {
272
- case ( token:: IDENT ( _, _) ) { p. bump ( ) ; /* ignore param name */ }
273
- case ( _) { /* no param name present */ }
274
- }
275
281
ret spanned( lo, t. span . hi , rec ( mode=mode, ty=t) ) ;
276
282
}
277
283
auto lo = p. get_lo_pos ( ) ;
@@ -342,14 +348,6 @@ fn parse_mt(&parser p) -> ast::mt {
342
348
}
343
349
344
350
fn parse_ty_field ( & parser p) -> ast:: ty_field {
345
- auto lo = p. get_lo_pos ( ) ;
346
- auto mt = parse_mt ( p) ;
347
- auto id = parse_ident ( p) ;
348
- ret spanned( lo, mt. ty . span . hi , rec ( ident=id, mt=mt) ) ;
349
- }
350
-
351
- // FIXME rename to parse_ty_field once the other one is dropped
352
- fn parse_ty_field_modern ( & parser p) -> ast:: ty_field {
353
351
auto lo = p. get_lo_pos ( ) ;
354
352
auto mut = parse_mutability ( p) ;
355
353
auto id = parse_ident ( p) ;
@@ -555,7 +553,7 @@ fn parse_ty(&parser p) -> @ast::ty {
555
553
t = ast:: ty_ptr ( mt) ;
556
554
} else if ( p. peek ( ) == token:: LBRACE ) {
557
555
auto elems = parse_seq ( token:: LBRACE , token:: RBRACE ,
558
- some ( token:: COMMA ) , parse_ty_field_modern , p) ;
556
+ some ( token:: COMMA ) , parse_ty_field , p) ;
559
557
hi = elems. span . hi ;
560
558
t = ast:: ty_rec ( elems. node ) ;
561
559
if ( p. peek ( ) == token:: COLON ) {
@@ -568,20 +566,6 @@ fn parse_ty(&parser p) -> @ast::ty {
568
566
t = ast:: ty_vec ( parse_mt ( p) ) ;
569
567
hi = p. get_hi_pos ( ) ;
570
568
expect ( p, token:: RBRACKET ) ;
571
- } else if ( eat_word ( p, "rec" ) ) {
572
- auto elems =
573
- parse_seq ( token:: LPAREN , token:: RPAREN , some ( token:: COMMA ) ,
574
- parse_ty_field, p) ;
575
- hi = elems. span . hi ;
576
- // possible constrs
577
- // FIXME: something seems dodgy or at least repetitive
578
- // about how constrained types get parsed
579
- t = ast:: ty_rec ( elems. node ) ;
580
- if ( p. peek ( ) == token:: COLON ) {
581
- p. bump ( ) ;
582
- t = ast:: ty_constr ( @spanned ( lo, hi, t) ,
583
- parse_type_constraints ( p) ) ;
584
- }
585
569
} else if ( eat_word ( p, "fn" ) ) {
586
570
auto flo = p. get_last_lo_pos ( ) ;
587
571
t = parse_ty_fn ( ast:: proto_fn, p, flo) ;
@@ -621,12 +605,12 @@ fn parse_ty(&parser p) -> @ast::ty {
621
605
622
606
fn parse_arg ( & parser p) -> ast:: arg {
623
607
let ast:: mode m = ast:: val;
624
- if ( p. peek ( ) == token:: BINOP ( token:: AND ) ) {
625
- p. bump ( ) ;
608
+ let ast:: ident i = parse_value_ident ( p) ;
609
+ expect ( p, token:: COLON ) ;
610
+ if eat ( p, token:: BINOP ( token:: AND ) ) {
626
611
m = ast:: alias ( eat_word ( p, "mutable" ) ) ;
627
612
}
628
613
let @ast:: ty t = parse_ty ( p) ;
629
- let ast:: ident i = parse_value_ident ( p) ;
630
614
ret rec( mode=m, ty=t, ident=i, id=p. get_id ( ) ) ;
631
615
}
632
616
@@ -710,6 +694,10 @@ fn is_ident(token::token t) -> bool {
710
694
ret false;
711
695
}
712
696
697
+ fn is_plain_ident ( & parser p) -> bool {
698
+ ret alt p. peek ( ) { token:: IDENT ( _, false ) { true } _ { false } } ;
699
+ }
700
+
713
701
fn parse_path ( & parser p) -> ast:: path {
714
702
auto lo = p. get_lo_pos ( ) ;
715
703
auto hi = lo;
@@ -806,8 +794,7 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
806
794
} else if ( p. peek ( ) == token:: LBRACE ) {
807
795
p. bump ( ) ;
808
796
if ( is_word ( p, "mutable" ) ||
809
- alt p. peek ( ) { token:: IDENT ( _, false ) { true } _ { false } } &&
810
- p. look_ahead ( 1 u) == token:: COLON ) {
797
+ is_plain_ident ( p) && p. look_ahead ( 1 u) == token:: COLON ) {
811
798
auto fields = ~[ parse_field ( p, token:: COLON ) ] ;
812
799
auto base = none;
813
800
while p. peek ( ) != token:: RBRACE {
@@ -915,27 +902,6 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
915
902
let ast:: anon_obj ob =
916
903
rec ( fields=fields, methods=meths, with_obj=with_obj) ;
917
904
ex = ast:: expr_anon_obj ( ob) ;
918
- } else if ( eat_word ( p, "rec" ) ) {
919
- expect ( p, token:: LPAREN ) ;
920
- auto fields = ~[ parse_field ( p, token:: EQ ) ] ;
921
- auto more = true ;
922
- auto base = none;
923
- while ( more) {
924
- if ( p. peek ( ) == token:: RPAREN ) {
925
- hi = p. get_hi_pos ( ) ;
926
- p. bump ( ) ;
927
- more = false ;
928
- } else if ( eat_word ( p, "with" ) ) {
929
- base = some ( parse_expr ( p) ) ;
930
- hi = p. get_hi_pos ( ) ;
931
- expect ( p, token:: RPAREN ) ;
932
- more = false ;
933
- } else if ( p. peek ( ) == token:: COMMA ) {
934
- p. bump ( ) ;
935
- fields += ~[ parse_field ( p, token:: EQ ) ] ;
936
- } else { unexpected ( p, p. peek ( ) ) ; }
937
- }
938
- ex = ast:: expr_rec ( fields, base) ;
939
905
} else if ( eat_word ( p, "bind" ) ) {
940
906
auto e = parse_expr_res ( p, RESTRICT_NO_CALL_EXPRS ) ;
941
907
fn parse_expr_opt ( & parser p) -> option:: t[ @ast:: expr ] {
@@ -1349,25 +1315,15 @@ fn parse_else_expr(&parser p) -> @ast::expr {
1349
1315
}
1350
1316
}
1351
1317
1352
- fn parse_head_local ( & parser p) -> @ast:: local {
1353
- if ( eat_word ( p, "auto" ) ) {
1354
- ret parse_auto_local ( p) ;
1355
- } else {
1356
- ret parse_typed_local ( p) ;
1357
- }
1358
- }
1359
-
1360
1318
fn parse_for_expr ( & parser p) -> @ast:: expr {
1361
1319
auto lo = p. get_last_lo_pos ( ) ;
1362
1320
auto is_each = eat_word ( p, "each" ) ;
1363
- expect ( p, token:: LPAREN ) ;
1364
- auto decl = parse_head_local ( p) ;
1321
+ auto decl = parse_local ( p, false ) ;
1365
1322
expect_word ( p, "in" ) ;
1366
1323
auto seq = parse_expr ( p) ;
1367
- expect ( p, token:: RPAREN ) ;
1368
1324
auto body = parse_block ( p) ;
1369
1325
auto hi = body. span . hi ;
1370
- if ( is_each) {
1326
+ if is_each {
1371
1327
ret mk_expr ( p, lo, hi, ast:: expr_for_each ( decl, seq, body) ) ;
1372
1328
} else {
1373
1329
ret mk_expr ( p, lo, hi, ast:: expr_for ( decl, seq, body) ) ;
@@ -1483,21 +1439,6 @@ fn parse_pat(&parser p) -> @ast::pat {
1483
1439
p. bump ( ) ;
1484
1440
pat = ast:: pat_wild;
1485
1441
}
1486
- case ( token:: QUES ) {
1487
- p. bump ( ) ;
1488
- alt ( p. peek ( ) ) {
1489
- case ( token:: IDENT ( ?id, _) ) {
1490
- hi = p. get_hi_pos ( ) ;
1491
- p. bump ( ) ;
1492
- pat = ast:: pat_bind ( p. get_str ( id) ) ;
1493
- }
1494
- case ( ?tok) {
1495
- p. fatal ( "expected identifier after '?' in pattern but " +
1496
- "found " + token:: to_str ( p. get_reader ( ) , tok) ) ;
1497
- fail;
1498
- }
1499
- }
1500
- }
1501
1442
case ( token:: AT ) {
1502
1443
p. bump ( ) ;
1503
1444
auto sub = parse_pat ( p) ;
@@ -1548,6 +1489,15 @@ fn parse_pat(&parser p) -> @ast::pat {
1548
1489
auto lit = parse_lit ( p) ;
1549
1490
hi = lit. span . hi ;
1550
1491
pat = ast:: pat_lit ( @lit) ;
1492
+ } else if ( is_plain_ident ( p) &&
1493
+ alt p. look_ahead ( 1 u) {
1494
+ token:: DOT | token:: LPAREN | token:: LBRACKET {
1495
+ false
1496
+ }
1497
+ _ { true }
1498
+ } ) {
1499
+ hi = p. get_hi_pos ( ) ;
1500
+ pat = ast:: pat_bind ( parse_ident ( p) ) ;
1551
1501
} else {
1552
1502
auto tag_path = parse_path_and_ty_param_substs ( p) ;
1553
1503
hi = tag_path. span . hi ;
@@ -1559,7 +1509,11 @@ fn parse_pat(&parser p) -> @ast::pat {
1559
1509
args = a. node ;
1560
1510
hi = a. span . hi ;
1561
1511
}
1562
- case ( _) { args = ~[ ] ; }
1512
+ case ( token:: DOT ) {
1513
+ args = ~[ ] ;
1514
+ p. bump ( ) ;
1515
+ }
1516
+ case ( _) { expect ( p, token:: LPAREN ) ; fail; }
1563
1517
}
1564
1518
pat = ast:: pat_tag ( tag_path, args) ;
1565
1519
}
@@ -1568,81 +1522,30 @@ fn parse_pat(&parser p) -> @ast::pat {
1568
1522
ret @rec( id=p. get_id ( ) , node=pat, span=rec ( lo=lo, hi=hi) ) ;
1569
1523
}
1570
1524
1571
- fn parse_local_full ( & option:: t[ @ast:: ty] tyopt , & parser p)
1572
- -> @ast:: local {
1525
+ fn parse_local ( & parser p, bool allow_init ) -> @ast:: local {
1573
1526
auto lo = p. get_lo_pos ( ) ;
1574
1527
auto ident = parse_value_ident ( p) ;
1575
- auto init = parse_initializer ( p) ;
1576
- ret @spanned ( lo, p. get_hi_pos ( ) ,
1577
- rec ( ty=tyopt,
1578
- infer=false ,
1579
- ident=ident,
1580
- init=init,
1581
- id=p. get_id ( ) ) ) ;
1582
- }
1583
-
1584
- fn parse_typed_local ( & parser p) -> @ast:: local {
1585
- auto ty = parse_ty ( p) ;
1586
- ret parse_local_full ( some ( ty) , p) ;
1587
- }
1588
-
1589
- fn parse_auto_local ( & parser p) -> @ast:: local {
1590
- ret parse_local_full ( none, p) ;
1591
- }
1592
-
1593
- // FIXME simplify when old syntax is no longer supported
1594
- fn parse_let ( & parser p) -> @ast:: decl {
1595
- if alt p. peek ( ) { token:: IDENT ( _, false ) { true } _ { false } } {
1596
- alt p. look_ahead ( 1 u) {
1597
- token:: COLON | token:: SEMI | token:: COMMA | token:: EQ |
1598
- token:: LARROW {
1599
- ret parse_let_modern( p) ;
1600
- }
1601
- _ { }
1602
- }
1528
+ auto ty = none;
1529
+ if eat ( p, token:: COLON ) {
1530
+ ty = some ( parse_ty ( p) ) ;
1603
1531
}
1604
- auto lo = p. get_last_lo_pos ( ) ;
1605
- auto locals = ~[ parse_typed_local ( p) ] ;
1606
- while p. peek ( ) == token:: COMMA {
1607
- p. bump ( ) ;
1608
- locals += ~[ parse_typed_local ( p) ] ;
1609
- }
1610
- ret @spanned ( lo, p. get_hi_pos ( ) , ast:: decl_local ( locals) ) ;
1532
+ auto init = if allow_init { parse_initializer ( p) }
1533
+ else { none } ;
1534
+ ret @spanned ( lo, p. get_last_hi_pos ( ) ,
1535
+ rec ( ty=ty, infer=false , ident=ident,
1536
+ init=init, id=p. get_id ( ) ) ) ;
1611
1537
}
1612
1538
1613
- fn parse_let_modern ( & parser p) -> @ast:: decl {
1614
- fn parse_local ( & parser p) -> @ast:: local {
1615
- auto lo = p. get_lo_pos ( ) ;
1616
- auto ident = parse_value_ident ( p) ;
1617
- auto ty = none;
1618
- if p. peek ( ) == token:: COLON {
1619
- p. bump ( ) ;
1620
- ty = some ( parse_ty ( p) ) ;
1621
- }
1622
- auto init = parse_initializer ( p) ;
1623
- ret @spanned ( lo, p. get_last_hi_pos ( ) ,
1624
- rec ( ty=ty, infer=false , ident=ident,
1625
- init=init, id=p. get_id ( ) ) ) ;
1626
- }
1539
+ fn parse_let ( & parser p) -> @ast:: decl {
1627
1540
auto lo = p. get_lo_pos ( ) ;
1628
- auto locals = ~[ parse_local ( p) ] ;
1541
+ auto locals = ~[ parse_local ( p, true ) ] ;
1629
1542
while p. peek ( ) == token:: COMMA {
1630
1543
p. bump ( ) ;
1631
- locals += ~[ parse_local ( p) ] ;
1544
+ locals += ~[ parse_local ( p, true ) ] ;
1632
1545
}
1633
1546
ret @spanned ( lo, p. get_last_hi_pos ( ) , ast:: decl_local ( locals) ) ;
1634
1547
}
1635
1548
1636
- fn parse_auto ( & parser p) -> @ast:: decl {
1637
- auto lo = p. get_last_lo_pos ( ) ;
1638
- auto locals = ~[ parse_auto_local ( p) ] ;
1639
- while p. peek ( ) == token:: COMMA {
1640
- p. bump ( ) ;
1641
- locals += ~[ parse_auto_local ( p) ] ;
1642
- }
1643
- ret @spanned ( lo, p. get_hi_pos ( ) , ast:: decl_local ( locals) ) ;
1644
- }
1645
-
1646
1549
fn parse_stmt ( & parser p) -> @ast:: stmt {
1647
1550
if ( p. get_file_type ( ) == SOURCE_FILE ) {
1648
1551
ret parse_source_stmt ( p) ;
@@ -1660,9 +1563,6 @@ fn parse_source_stmt(&parser p) -> @ast::stmt {
1660
1563
if ( eat_word ( p, "let" ) ) {
1661
1564
auto decl = parse_let ( p) ;
1662
1565
ret @spanned ( lo, decl. span . hi , ast:: stmt_decl ( decl, p. get_id ( ) ) ) ;
1663
- } else if ( eat_word ( p, "auto" ) ) {
1664
- auto decl = parse_auto ( p) ;
1665
- ret @spanned ( lo, decl. span . hi , ast:: stmt_decl ( decl, p. get_id ( ) ) ) ;
1666
1566
} else {
1667
1567
1668
1568
auto item_attrs;
@@ -1850,11 +1750,11 @@ fn parse_ty_params(&parser p) -> ast::ty_param[] {
1850
1750
fn parse_fn_decl ( & parser p, ast:: purity purity) -> ast:: fn_decl {
1851
1751
let ast:: spanned[ ast:: arg[ ] ] inputs =
1852
1752
parse_seq ( token:: LPAREN , token:: RPAREN , some ( token:: COMMA ) ,
1853
- parse_arg, p) ;
1753
+ parse_arg, p) ;
1854
1754
let ty_or_bang rslt;
1855
- // Use the args list to translate each bound variable
1856
- // mentioned in a constraint to an arg index.
1857
- // Seems weird to do this in the parser, but I'm not sure how else to.
1755
+ // Use the args list to translate each bound variable
1756
+ // mentioned in a constraint to an arg index.
1757
+ // Seems weird to do this in the parser, but I'm not sure how else to.
1858
1758
auto constrs = ~[ ] ;
1859
1759
if ( p. peek ( ) == token:: COLON ) {
1860
1760
p. bump ( ) ;
@@ -1917,15 +1817,17 @@ fn parse_item_fn_or_iter(&parser p, ast::purity purity, ast::proto proto,
1917
1817
1918
1818
fn parse_obj_field ( & parser p) -> ast:: obj_field {
1919
1819
auto mut = parse_mutability ( p) ;
1920
- auto ty = parse_ty ( p) ;
1921
1820
auto ident = parse_value_ident ( p) ;
1821
+ expect ( p, token:: COLON ) ;
1822
+ auto ty = parse_ty ( p) ;
1922
1823
ret rec ( mut=mut, ty=ty, ident=ident, id=p. get_id ( ) ) ;
1923
1824
}
1924
1825
1925
1826
fn parse_anon_obj_field ( & parser p) -> ast:: anon_obj_field {
1926
1827
auto mut = parse_mutability ( p) ;
1927
- auto ty = parse_ty ( p) ;
1928
1828
auto ident = parse_value_ident ( p) ;
1829
+ expect ( p, token:: COLON ) ;
1830
+ auto ty = parse_ty ( p) ;
1929
1831
expect ( p, token:: EQ ) ;
1930
1832
auto expr = parse_expr ( p) ;
1931
1833
ret rec ( mut=mut, ty=ty, expr=expr, ident=ident, id=p. get_id ( ) ) ;
@@ -1988,8 +1890,9 @@ fn parse_item_res(&parser p, ast::layer lyr, &ast::attribute[] attrs) ->
1988
1890
auto ident = parse_value_ident ( p) ;
1989
1891
auto ty_params = parse_ty_params ( p) ;
1990
1892
expect ( p, token:: LPAREN ) ;
1991
- auto t = parse_ty ( p) ;
1992
1893
auto arg_ident = parse_value_ident ( p) ;
1894
+ expect ( p, token:: COLON ) ;
1895
+ auto t = parse_ty ( p) ;
1993
1896
expect ( p, token:: RPAREN ) ;
1994
1897
auto dtor = parse_block ( p) ;
1995
1898
auto decl = rec ( inputs=~[ rec ( mode=ast:: alias ( false ) , ty=t,
@@ -2029,8 +1932,9 @@ fn parse_mod_items(&parser p, token::token term,
2029
1932
2030
1933
fn parse_item_const( & parser p, & ast:: attribute[ ] attrs) -> @ast:: item {
2031
1934
auto lo = p. get_last_lo_pos( ) ;
2032
- auto ty = parse_ty ( p) ;
2033
1935
auto id = parse_value_ident ( p) ;
1936
+ expect ( p, token:: COLON ) ;
1937
+ auto ty = parse_ty ( p) ;
2034
1938
expect ( p, token:: EQ ) ;
2035
1939
auto e = parse_expr ( p) ;
2036
1940
auto hi = p. get_hi_pos ( ) ;
0 commit comments