Skip to content

Commit 0047f8b

Browse files
committed
Auto merge of #22163 - bleibig:grammar-updates, r=sanxiyn
Updates to the bison grammar: * Fixes to range syntax - allow `expr[..]`, and fix precedence to allow `for _ in i.. { }` * Allow "extern crate" in stmts * Add qualified path expressions (`<TYPE as TRAIT_REF>::item`)
2 parents 5936278 + 3bca5f2 commit 0047f8b

File tree

1 file changed

+48
-83
lines changed

1 file changed

+48
-83
lines changed

src/grammar/parser-lalr.y

+48-83
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ extern char *yytext;
177177

178178
%precedence '{' '[' '(' '.'
179179

180+
%precedence RANGE
181+
180182
%start crate
181183

182184
%%
@@ -258,11 +260,7 @@ mod_item
258260

259261
// items that can appear outside of a fn block
260262
item
261-
: item_static
262-
| item_const
263-
| item_type
264-
| block_item
265-
| view_item
263+
: stmt_item
266264
| item_macro
267265
;
268266

@@ -272,8 +270,7 @@ stmt_item
272270
| item_const
273271
| item_type
274272
| block_item
275-
| use_item
276-
| extern_fn_item
273+
| view_item
277274
;
278275

279276
item_static
@@ -295,7 +292,6 @@ view_item
295292
: use_item
296293
| extern_fn_item
297294
| EXTERN CRATE ident ';' { $$ = mk_node("ViewItemExternCrate", 1, $3); }
298-
| EXTERN CRATE ident '=' str ';' { $$ = mk_node("ViewItemExternCrate", 2, $3, $5); }
299295
| EXTERN CRATE str AS ident ';' { $$ = mk_node("ViewItemExternCrate", 2, $3, $5); }
300296
;
301297

@@ -1193,12 +1189,10 @@ maybe_stmts
11931189
//
11941190
// In non-stmts contexts, expr can relax this trichotomy.
11951191
//
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.
12021196

12031197
stmts
12041198
: stmt { $$ = mk_node("stmts", 1, $1); }
@@ -1265,7 +1259,7 @@ nonblock_expr
12651259
| path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); }
12661260
| nonblock_expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
12671261
| 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); }
12691263
| nonblock_expr '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
12701264
| '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
12711265
| '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); }
@@ -1307,9 +1301,11 @@ nonblock_expr
13071301
| nonblock_expr DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
13081302
| nonblock_expr DOTDOT expr { $$ = mk_node("ExprRange", 2, $1, $3); }
13091303
| DOTDOT expr { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1304+
| DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
13101305
| nonblock_expr AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
13111306
| BOX nonparen_expr { $$ = mk_node("ExprBox", 1, $2); }
13121307
| %prec BOXPLACE BOX '(' maybe_expr ')' nonblock_expr { $$ = mk_node("ExprBox", 2, $3, $5); }
1308+
| expr_qualified_path
13131309
| nonblock_prefix_expr
13141310
;
13151311

@@ -1322,7 +1318,7 @@ expr
13221318
| path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); }
13231319
| expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
13241320
| 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); }
13261322
| expr '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
13271323
| '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); }
13281324
| '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
@@ -1364,9 +1360,11 @@ expr
13641360
| expr DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
13651361
| expr DOTDOT expr { $$ = mk_node("ExprRange", 2, $1, $3); }
13661362
| DOTDOT expr { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1363+
| DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
13671364
| expr AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
13681365
| BOX nonparen_expr { $$ = mk_node("ExprBox", 1, $2); }
13691366
| %prec BOXPLACE BOX '(' maybe_expr ')' expr { $$ = mk_node("ExprBox", 2, $3, $5); }
1367+
| expr_qualified_path
13701368
| block_expr
13711369
| block
13721370
| nonblock_prefix_expr
@@ -1381,7 +1379,7 @@ nonparen_expr
13811379
| path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); }
13821380
| nonparen_expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
13831381
| 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); }
13851383
| nonparen_expr '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
13861384
| '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
13871385
| CONTINUE { $$ = mk_node("ExprAgain", 0); }
@@ -1422,65 +1420,11 @@ nonparen_expr
14221420
| nonparen_expr DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
14231421
| nonparen_expr DOTDOT nonparen_expr { $$ = mk_node("ExprRange", 2, $1, $3); }
14241422
| DOTDOT nonparen_expr { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1423+
| DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
14251424
| nonparen_expr AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
14261425
| BOX nonparen_expr { $$ = mk_node("ExprBox", 1, $2); }
14271426
| %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
14841428
| block_expr
14851429
| block
14861430
| nonblock_prefix_expr
@@ -1494,7 +1438,7 @@ expr_nostruct
14941438
| macro_expr { $$ = mk_node("ExprMac", 1, $1); }
14951439
| expr_nostruct '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
14961440
| 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); }
14981442
| expr_nostruct '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
14991443
| '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
15001444
| '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); }
@@ -1533,12 +1477,14 @@ expr_nostruct
15331477
| expr_nostruct '*' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiMul"), $1, $3); }
15341478
| expr_nostruct '/' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiDiv"), $1, $3); }
15351479
| 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()); }
15371481
| expr_nostruct DOTDOT expr_nostruct { $$ = mk_node("ExprRange", 2, $1, $3); }
15381482
| DOTDOT expr_nostruct { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1483+
| DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
15391484
| expr_nostruct AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
15401485
| BOX nonparen_expr { $$ = mk_node("ExprBox", 1, $2); }
15411486
| %prec BOXPLACE BOX '(' maybe_expr ')' expr_nostruct { $$ = mk_node("ExprBox", 1, $3, $5); }
1487+
| expr_qualified_path
15421488
| block_expr
15431489
| block
15441490
| nonblock_prefix_expr_nostruct
@@ -1566,6 +1512,33 @@ nonblock_prefix_expr
15661512
| proc_expr
15671513
;
15681514

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+
15691542
lambda_expr
15701543
: %prec LAMBDA
15711544
OROR ret_ty expr { $$ = mk_node("ExprFnBlock", 3, mk_none(), $2, $3); }
@@ -1612,14 +1585,6 @@ vec_expr
16121585
| exprs ';' expr { $$ = mk_node("VecRepeat", 2, $1, $3); }
16131586
;
16141587

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-
16231588
struct_expr_fields
16241589
: field_inits
16251590
| field_inits ','

0 commit comments

Comments
 (0)