@@ -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
260262item
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
279276item_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
12031197stmts
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+
15691542lambda_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-
16231588struct_expr_fields
16241589: field_inits
16251590| field_inits ','
0 commit comments