@@ -177,6 +177,8 @@ extern char *yytext;
177
177
178
178
%precedence ' {' ' [' ' (' ' .'
179
179
180
+ %precedence RANGE
181
+
180
182
%start crate
181
183
182
184
%%
@@ -258,11 +260,7 @@ mod_item
258
260
259
261
// items that can appear outside of a fn block
260
262
item
261
- : item_static
262
- | item_const
263
- | item_type
264
- | block_item
265
- | view_item
263
+ : stmt_item
266
264
| item_macro
267
265
;
268
266
@@ -272,8 +270,7 @@ stmt_item
272
270
| item_const
273
271
| item_type
274
272
| block_item
275
- | use_item
276
- | extern_fn_item
273
+ | view_item
277
274
;
278
275
279
276
item_static
@@ -295,7 +292,6 @@ view_item
295
292
: use_item
296
293
| extern_fn_item
297
294
| EXTERN CRATE ident ';' { $$ = mk_node("ViewItemExternCrate", 1, $3); }
298
- | EXTERN CRATE ident '=' str ';' { $$ = mk_node("ViewItemExternCrate", 2, $3, $5); }
299
295
| EXTERN CRATE str AS ident ';' { $$ = mk_node("ViewItemExternCrate", 2, $3, $5); }
300
296
;
301
297
@@ -1193,12 +1189,10 @@ maybe_stmts
1193
1189
//
1194
1190
// In non-stmts contexts, expr can relax this trichotomy.
1195
1191
//
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.
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.
1202
1196
1203
1197
stmts
1204
1198
: stmt { $$ = mk_node("stmts", 1, $1); }
@@ -1265,7 +1259,7 @@ nonblock_expr
1265
1259
| path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); }
1266
1260
| nonblock_expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
1267
1261
| nonblock_expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1268
- | nonblock_expr '[' index_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1262
+ | nonblock_expr '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1269
1263
| nonblock_expr '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
1270
1264
| '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
1271
1265
| '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); }
@@ -1307,9 +1301,11 @@ nonblock_expr
1307
1301
| nonblock_expr DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
1308
1302
| nonblock_expr DOTDOT expr { $$ = mk_node("ExprRange", 2, $1, $3); }
1309
1303
| DOTDOT expr { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1304
+ | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
1310
1305
| nonblock_expr AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
1311
1306
| BOX nonparen_expr { $$ = mk_node("ExprBox", 1, $2); }
1312
1307
| %prec BOXPLACE BOX '(' maybe_expr ')' nonblock_expr { $$ = mk_node("ExprBox", 2, $3, $5); }
1308
+ | expr_qualified_path
1313
1309
| nonblock_prefix_expr
1314
1310
;
1315
1311
@@ -1322,7 +1318,7 @@ expr
1322
1318
| path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); }
1323
1319
| expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
1324
1320
| expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1325
- | expr '[' index_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1321
+ | expr '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1326
1322
| expr '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
1327
1323
| '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); }
1328
1324
| '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
@@ -1364,9 +1360,11 @@ expr
1364
1360
| expr DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
1365
1361
| expr DOTDOT expr { $$ = mk_node("ExprRange", 2, $1, $3); }
1366
1362
| DOTDOT expr { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1363
+ | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
1367
1364
| expr AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
1368
1365
| BOX nonparen_expr { $$ = mk_node("ExprBox", 1, $2); }
1369
1366
| %prec BOXPLACE BOX '(' maybe_expr ')' expr { $$ = mk_node("ExprBox", 2, $3, $5); }
1367
+ | expr_qualified_path
1370
1368
| block_expr
1371
1369
| block
1372
1370
| nonblock_prefix_expr
@@ -1381,7 +1379,7 @@ nonparen_expr
1381
1379
| path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); }
1382
1380
| nonparen_expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
1383
1381
| nonparen_expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1384
- | nonparen_expr '[' index_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1382
+ | nonparen_expr '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1385
1383
| nonparen_expr '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
1386
1384
| '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
1387
1385
| CONTINUE { $$ = mk_node("ExprAgain", 0); }
@@ -1422,65 +1420,11 @@ nonparen_expr
1422
1420
| nonparen_expr DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
1423
1421
| nonparen_expr DOTDOT nonparen_expr { $$ = mk_node("ExprRange", 2, $1, $3); }
1424
1422
| DOTDOT nonparen_expr { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1423
+ | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
1425
1424
| nonparen_expr AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
1426
1425
| BOX nonparen_expr { $$ = mk_node("ExprBox", 1, $2); }
1427
1426
| %prec BOXPLACE BOX '(' maybe_expr ')' expr { $$ = mk_node("ExprBox", 1, $3, $5); }
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); }
1427
+ | expr_qualified_path
1484
1428
| block_expr
1485
1429
| block
1486
1430
| nonblock_prefix_expr
@@ -1494,7 +1438,7 @@ expr_nostruct
1494
1438
| macro_expr { $$ = mk_node("ExprMac", 1, $1); }
1495
1439
| expr_nostruct '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
1496
1440
| expr_nostruct '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1497
- | expr_nostruct '[' index_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1441
+ | expr_nostruct '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1498
1442
| expr_nostruct '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
1499
1443
| '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
1500
1444
| '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); }
@@ -1533,12 +1477,14 @@ expr_nostruct
1533
1477
| expr_nostruct '*' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiMul"), $1, $3); }
1534
1478
| expr_nostruct '/' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiDiv"), $1, $3); }
1535
1479
| expr_nostruct '%' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiRem"), $1, $3); }
1536
- | expr_nostruct DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
1480
+ | expr_nostruct DOTDOT %prec RANGE { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
1537
1481
| expr_nostruct DOTDOT expr_nostruct { $$ = mk_node("ExprRange", 2, $1, $3); }
1538
1482
| DOTDOT expr_nostruct { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1483
+ | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
1539
1484
| expr_nostruct AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
1540
1485
| BOX nonparen_expr { $$ = mk_node("ExprBox", 1, $2); }
1541
1486
| %prec BOXPLACE BOX '(' maybe_expr ')' expr_nostruct { $$ = mk_node("ExprBox", 1, $3, $5); }
1487
+ | expr_qualified_path
1542
1488
| block_expr
1543
1489
| block
1544
1490
| nonblock_prefix_expr_nostruct
@@ -1566,6 +1512,33 @@ nonblock_prefix_expr
1566
1512
| proc_expr
1567
1513
;
1568
1514
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
+
1569
1542
lambda_expr
1570
1543
: %prec LAMBDA
1571
1544
OROR ret_ty expr { $$ = mk_node("ExprFnBlock", 3, mk_none(), $2, $3); }
@@ -1612,14 +1585,6 @@ vec_expr
1612
1585
| exprs ';' expr { $$ = mk_node("VecRepeat", 2, $1, $3); }
1613
1586
;
1614
1587
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
-
1623
1588
struct_expr_fields
1624
1589
: field_inits
1625
1590
| field_inits ','
0 commit comments