@@ -177,8 +177,6 @@ extern char *yytext;
177
177
178
178
%precedence ' {' ' [' ' (' ' .'
179
179
180
- %precedence RANGE
181
-
182
180
%start crate
183
181
184
182
%%
@@ -260,7 +258,11 @@ mod_item
260
258
261
259
// items that can appear outside of a fn block
262
260
item
263
- : stmt_item
261
+ : item_static
262
+ | item_const
263
+ | item_type
264
+ | block_item
265
+ | view_item
264
266
| item_macro
265
267
;
266
268
@@ -270,7 +272,8 @@ stmt_item
270
272
| item_const
271
273
| item_type
272
274
| block_item
273
- | view_item
275
+ | use_item
276
+ | extern_fn_item
274
277
;
275
278
276
279
item_static
@@ -292,6 +295,7 @@ view_item
292
295
: use_item
293
296
| extern_fn_item
294
297
| EXTERN CRATE ident ';' { $$ = mk_node("ViewItemExternCrate", 1, $3); }
298
+ | EXTERN CRATE ident '=' str ';' { $$ = mk_node("ViewItemExternCrate", 2, $3, $5); }
295
299
| EXTERN CRATE str AS ident ';' { $$ = mk_node("ViewItemExternCrate", 2, $3, $5); }
296
300
;
297
301
@@ -1189,10 +1193,12 @@ maybe_stmts
1189
1193
//
1190
1194
// In non-stmts contexts, expr can relax this trichotomy.
1191
1195
//
1192
- // There is also one other expr subtype: nonparen_expr disallows exprs
1193
- // surrounded by parens (including tuple expressions), this is
1194
- // necessary for BOX (place) expressions, so a parens expr following
1195
- // the BOX is always parsed as the place.
1196
+ // There are also two other expr subtypes: first, nonparen_expr
1197
+ // disallows exprs surrounded by parens (including tuple expressions),
1198
+ // this is necessary for BOX (place) expressions, so a parens expr
1199
+ // following the BOX is always parsed as the place. There is also
1200
+ // expr_norange used in index_expr, which disallows '..' in
1201
+ // expressions as that has special meaning inside of brackets.
1196
1202
1197
1203
stmts
1198
1204
: stmt { $$ = mk_node("stmts", 1, $1); }
@@ -1259,7 +1265,7 @@ nonblock_expr
1259
1265
| path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); }
1260
1266
| nonblock_expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
1261
1267
| nonblock_expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1262
- | nonblock_expr '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1268
+ | nonblock_expr '[' index_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1263
1269
| nonblock_expr '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
1264
1270
| '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
1265
1271
| '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); }
@@ -1301,11 +1307,9 @@ nonblock_expr
1301
1307
| nonblock_expr DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
1302
1308
| nonblock_expr DOTDOT expr { $$ = mk_node("ExprRange", 2, $1, $3); }
1303
1309
| DOTDOT expr { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1304
- | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
1305
1310
| nonblock_expr AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
1306
1311
| BOX nonparen_expr { $$ = mk_node("ExprBox", 1, $2); }
1307
1312
| %prec BOXPLACE BOX '(' maybe_expr ')' nonblock_expr { $$ = mk_node("ExprBox", 2, $3, $5); }
1308
- | expr_qualified_path
1309
1313
| nonblock_prefix_expr
1310
1314
;
1311
1315
@@ -1318,7 +1322,7 @@ expr
1318
1322
| path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); }
1319
1323
| expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
1320
1324
| expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1321
- | expr '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1325
+ | expr '[' index_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1322
1326
| expr '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
1323
1327
| '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); }
1324
1328
| '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
@@ -1360,11 +1364,9 @@ expr
1360
1364
| expr DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
1361
1365
| expr DOTDOT expr { $$ = mk_node("ExprRange", 2, $1, $3); }
1362
1366
| DOTDOT expr { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1363
- | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
1364
1367
| expr AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
1365
1368
| BOX nonparen_expr { $$ = mk_node("ExprBox", 1, $2); }
1366
1369
| %prec BOXPLACE BOX '(' maybe_expr ')' expr { $$ = mk_node("ExprBox", 2, $3, $5); }
1367
- | expr_qualified_path
1368
1370
| block_expr
1369
1371
| block
1370
1372
| nonblock_prefix_expr
@@ -1379,7 +1381,7 @@ nonparen_expr
1379
1381
| path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); }
1380
1382
| nonparen_expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
1381
1383
| nonparen_expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1382
- | nonparen_expr '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1384
+ | nonparen_expr '[' index_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1383
1385
| nonparen_expr '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
1384
1386
| '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
1385
1387
| CONTINUE { $$ = mk_node("ExprAgain", 0); }
@@ -1420,11 +1422,65 @@ nonparen_expr
1420
1422
| nonparen_expr DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
1421
1423
| nonparen_expr DOTDOT nonparen_expr { $$ = mk_node("ExprRange", 2, $1, $3); }
1422
1424
| DOTDOT nonparen_expr { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1423
- | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
1424
1425
| nonparen_expr AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
1425
1426
| BOX nonparen_expr { $$ = mk_node("ExprBox", 1, $2); }
1426
1427
| %prec BOXPLACE BOX '(' maybe_expr ')' expr { $$ = mk_node("ExprBox", 1, $3, $5); }
1427
- | expr_qualified_path
1428
+ | block_expr
1429
+ | block
1430
+ | nonblock_prefix_expr
1431
+ ;
1432
+
1433
+ expr_norange
1434
+ : lit { $$ = mk_node("ExprLit", 1, $1); }
1435
+ | %prec IDENT
1436
+ path_expr { $$ = mk_node("ExprPath", 1, $1); }
1437
+ | SELF { $$ = mk_node("ExprPath", 1, mk_node("ident", 1, mk_atom("self"))); }
1438
+ | macro_expr { $$ = mk_node("ExprMac", 1, $1); }
1439
+ | path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); }
1440
+ | expr_norange '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
1441
+ | expr_norange '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1442
+ | expr_norange '[' index_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1443
+ | expr_norange '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
1444
+ | '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); }
1445
+ | '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
1446
+ | CONTINUE { $$ = mk_node("ExprAgain", 0); }
1447
+ | CONTINUE ident { $$ = mk_node("ExprAgain", 1, $2); }
1448
+ | RETURN { $$ = mk_node("ExprRet", 0); }
1449
+ | RETURN expr { $$ = mk_node("ExprRet", 1, $2); }
1450
+ | BREAK { $$ = mk_node("ExprBreak", 0); }
1451
+ | BREAK ident { $$ = mk_node("ExprBreak", 1, $2); }
1452
+ | expr_norange '=' expr_norange { $$ = mk_node("ExprAssign", 2, $1, $3); }
1453
+ | expr_norange SHLEQ expr_norange { $$ = mk_node("ExprAssignShl", 2, $1, $3); }
1454
+ | expr_norange SHREQ expr_norange { $$ = mk_node("ExprAssignShr", 2, $1, $3); }
1455
+ | expr_norange MINUSEQ expr_norange { $$ = mk_node("ExprAssignSub", 2, $1, $3); }
1456
+ | expr_norange ANDEQ expr_norange { $$ = mk_node("ExprAssignBitAnd", 2, $1, $3); }
1457
+ | expr_norange OREQ expr_norange { $$ = mk_node("ExprAssignBitOr", 2, $1, $3); }
1458
+ | expr_norange PLUSEQ expr_norange { $$ = mk_node("ExprAssignAdd", 2, $1, $3); }
1459
+ | expr_norange STAREQ expr_norange { $$ = mk_node("ExprAssignMul", 2, $1, $3); }
1460
+ | expr_norange SLASHEQ expr_norange { $$ = mk_node("ExprAssignDiv", 2, $1, $3); }
1461
+ | expr_norange CARETEQ expr_norange { $$ = mk_node("ExprAssignBitXor", 2, $1, $3); }
1462
+ | expr_norange PERCENTEQ expr_norange { $$ = mk_node("ExprAssignRem", 2, $1, $3); }
1463
+ | expr_norange OROR expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiOr"), $1, $3); }
1464
+ | expr_norange ANDAND expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiAnd"), $1, $3); }
1465
+ | expr_norange EQEQ expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiEq"), $1, $3); }
1466
+ | expr_norange NE expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiNe"), $1, $3); }
1467
+ | expr_norange '<' expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiLt"), $1, $3); }
1468
+ | expr_norange '>' expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiGt"), $1, $3); }
1469
+ | expr_norange LE expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiLe"), $1, $3); }
1470
+ | expr_norange GE expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiGe"), $1, $3); }
1471
+ | expr_norange '|' expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitOr"), $1, $3); }
1472
+ | expr_norange '^' expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitXor"), $1, $3); }
1473
+ | expr_norange '&' expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitAnd"), $1, $3); }
1474
+ | expr_norange SHL expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiShl"), $1, $3); }
1475
+ | expr_norange SHR expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiShr"), $1, $3); }
1476
+ | expr_norange '+' expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiAdd"), $1, $3); }
1477
+ | expr_norange '-' expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiSub"), $1, $3); }
1478
+ | expr_norange '*' expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiMul"), $1, $3); }
1479
+ | expr_norange '/' expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiDiv"), $1, $3); }
1480
+ | expr_norange '%' expr_norange { $$ = mk_node("ExprBinary", 3, mk_atom("BiRem"), $1, $3); }
1481
+ | expr_norange AS ty { $$ = mk_node("Expr_NorangeCast", 2, $1, $3); }
1482
+ | BOX nonparen_expr { $$ = mk_node("ExprBox", 1, $2); }
1483
+ | %prec BOXPLACE BOX '(' maybe_expr ')' expr_norange { $$ = mk_node("ExprBox", 2, $3, $5); }
1428
1484
| block_expr
1429
1485
| block
1430
1486
| nonblock_prefix_expr
@@ -1438,7 +1494,7 @@ expr_nostruct
1438
1494
| macro_expr { $$ = mk_node("ExprMac", 1, $1); }
1439
1495
| expr_nostruct '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
1440
1496
| expr_nostruct '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1441
- | expr_nostruct '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1497
+ | expr_nostruct '[' index_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1442
1498
| expr_nostruct '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
1443
1499
| '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
1444
1500
| '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); }
@@ -1477,14 +1533,12 @@ expr_nostruct
1477
1533
| expr_nostruct '*' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiMul"), $1, $3); }
1478
1534
| expr_nostruct '/' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiDiv"), $1, $3); }
1479
1535
| expr_nostruct '%' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiRem"), $1, $3); }
1480
- | expr_nostruct DOTDOT %prec RANGE { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
1536
+ | expr_nostruct DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
1481
1537
| expr_nostruct DOTDOT expr_nostruct { $$ = mk_node("ExprRange", 2, $1, $3); }
1482
1538
| DOTDOT expr_nostruct { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1483
- | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
1484
1539
| expr_nostruct AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
1485
1540
| BOX nonparen_expr { $$ = mk_node("ExprBox", 1, $2); }
1486
1541
| %prec BOXPLACE BOX '(' maybe_expr ')' expr_nostruct { $$ = mk_node("ExprBox", 1, $3, $5); }
1487
- | expr_qualified_path
1488
1542
| block_expr
1489
1543
| block
1490
1544
| nonblock_prefix_expr_nostruct
@@ -1512,33 +1566,6 @@ nonblock_prefix_expr
1512
1566
| proc_expr
1513
1567
;
1514
1568
1515
- expr_qualified_path
1516
- : '<' ty_sum AS trait_ref '>' MOD_SEP ident
1517
- {
1518
- $$ = mk_node("ExprQualifiedPath", 3, $2, $4, $7);
1519
- }
1520
- | '<' ty_sum AS trait_ref '>' MOD_SEP ident generic_args
1521
- {
1522
- $$ = mk_node("ExprQualifiedPath", 4, $2, $4, $7, $8);
1523
- }
1524
- | SHL ty_sum AS trait_ref '>' MOD_SEP ident AS trait_ref '>' MOD_SEP ident
1525
- {
1526
- $$ = mk_node("ExprQualifiedPath", 3, mk_node("ExprQualifiedPath", 3, $2, $4, $7), $9, $12);
1527
- }
1528
- | SHL ty_sum AS trait_ref '>' MOD_SEP ident generic_args AS trait_ref '>' MOD_SEP ident
1529
- {
1530
- $$ = mk_node("ExprQualifiedPath", 3, mk_node("ExprQualifiedPath", 4, $2, $4, $7, $8), $10, $13);
1531
- }
1532
- | SHL ty_sum AS trait_ref '>' MOD_SEP ident AS trait_ref '>' MOD_SEP ident generic_args
1533
- {
1534
- $$ = mk_node("ExprQualifiedPath", 4, mk_node("ExprQualifiedPath", 3, $2, $4, $7), $9, $12, $13);
1535
- }
1536
- | SHL ty_sum AS trait_ref '>' MOD_SEP ident generic_args AS trait_ref '>' MOD_SEP ident generic_args
1537
- {
1538
- $$ = mk_node("ExprQualifiedPath", 4, mk_node("ExprQualifiedPath", 4, $2, $4, $7, $8), $10, $13, $14);
1539
- }
1540
-
1541
-
1542
1569
lambda_expr
1543
1570
: %prec LAMBDA
1544
1571
OROR ret_ty expr { $$ = mk_node("ExprFnBlock", 3, mk_none(), $2, $3); }
@@ -1585,6 +1612,14 @@ vec_expr
1585
1612
| exprs ';' expr { $$ = mk_node("VecRepeat", 2, $1, $3); }
1586
1613
;
1587
1614
1615
+ index_expr
1616
+ : expr_norange { $$ = mk_node("Index", 1, $1); }
1617
+ | expr_norange DOTDOT { $$ = mk_node("SliceToEnd", 1, $1); }
1618
+ | DOTDOT expr_norange { $$ = mk_node("SliceFromBeginning", 1, $2); }
1619
+ | expr_norange DOTDOT expr_norange { $$ = mk_node("Slice", 2, $1, $3); }
1620
+ | %empty { $$ = mk_none(); }
1621
+ ;
1622
+
1588
1623
struct_expr_fields
1589
1624
: field_inits
1590
1625
| field_inits ','
0 commit comments