Skip to content

Commit 2e7d7bc

Browse files
committed
Auto merge of #25337 - bleibig:update-grammar, r=nikomatsakis
* Correctly lex CRLF in string literals * Update `extern CRATE as NAME` syntax * Allow leading `::` in view paths * Allow TySums in type ascriptions and impls * Allow macros to have visibility and attributes * Update syntax for qualified path types and expressions * Allow block expressions to be called () and indexed []
2 parents 4daa62a + 568d7f1 commit 2e7d7bc

File tree

2 files changed

+34
-23
lines changed

2 files changed

+34
-23
lines changed

src/grammar/lexer.l

+1-1
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ r/# {
311311
<str>\x22 { BEGIN(suffix); return LIT_STR; }
312312

313313
<str><<EOF>> { return -1; }
314-
<str>\\[n\nrt\\\x27\x220] { yymore(); }
314+
<str>\\[n\nr\rt\\\x27\x220] { yymore(); }
315315
<str>\\x[0-9a-fA-F]{2} { yymore(); }
316316
<str>\\u\{[0-9a-fA-F]?{6}\} { yymore(); }
317317
<str>\\[^n\nrt\\\x27\x220] { return -1; }

src/grammar/parser-lalr.y

+33-22
Original file line numberDiff line numberDiff line change
@@ -289,16 +289,16 @@ item_const
289289
;
290290

291291
item_macro
292-
: path_expr '!' maybe_ident parens_delimited_token_trees ';'
293-
| path_expr '!' maybe_ident braces_delimited_token_trees
294-
| path_expr '!' maybe_ident brackets_delimited_token_trees ';'
292+
: path_expr '!' maybe_ident parens_delimited_token_trees ';' { $$ = mk_node("ItemMacro", 3, $1, $3, $4); }
293+
| path_expr '!' maybe_ident braces_delimited_token_trees { $$ = mk_node("ItemMacro", 3, $1, $3, $4); }
294+
| path_expr '!' maybe_ident brackets_delimited_token_trees ';'{ $$ = mk_node("ItemMacro", 3, $1, $3, $4); }
295295
;
296296

297297
view_item
298298
: use_item
299299
| extern_fn_item
300300
| EXTERN CRATE ident ';' { $$ = mk_node("ViewItemExternCrate", 1, $3); }
301-
| EXTERN CRATE str AS ident ';' { $$ = mk_node("ViewItemExternCrate", 2, $3, $5); }
301+
| EXTERN CRATE ident AS ident ';' { $$ = mk_node("ViewItemExternCrate", 2, $3, $5); }
302302
;
303303

304304
extern_fn_item
@@ -312,8 +312,11 @@ use_item
312312
view_path
313313
: path_no_types_allowed { $$ = mk_node("ViewPathSimple", 1, $1); }
314314
| path_no_types_allowed MOD_SEP '{' '}' { $$ = mk_node("ViewPathList", 2, $1, mk_atom("ViewPathListEmpty")); }
315+
| MOD_SEP '{' '}' { $$ = mk_node("ViewPathList", 1, mk_atom("ViewPathListEmpty")); }
315316
| path_no_types_allowed MOD_SEP '{' idents_or_self '}' { $$ = mk_node("ViewPathList", 2, $1, $4); }
317+
| MOD_SEP '{' idents_or_self '}' { $$ = mk_node("ViewPathList", 1, $3); }
316318
| path_no_types_allowed MOD_SEP '{' idents_or_self ',' '}' { $$ = mk_node("ViewPathList", 2, $1, $4); }
319+
| MOD_SEP '{' idents_or_self ',' '}' { $$ = mk_node("ViewPathList", 1, $3); }
317320
| path_no_types_allowed MOD_SEP '*' { $$ = mk_node("ViewPathGlob", 1, $1); }
318321
| '{' '}' { $$ = mk_atom("ViewPathListEmpty"); }
319322
| '{' idents_or_self '}' { $$ = mk_node("ViewPathList", 1, $2); }
@@ -333,7 +336,7 @@ block_item
333336
;
334337

335338
maybe_ty_ascription
336-
: ':' ty { $$ = $2; }
339+
: ':' ty_sum { $$ = $2; }
337340
| %empty { $$ = mk_none(); }
338341
;
339342

@@ -511,7 +514,7 @@ trait_item
511514
;
512515

513516
trait_const
514-
: maybe_outer_attrs CONST ident maybe_const_default ';' { $$ = mk_node("ConstTraitItem", 3, $1, $3, $4); }
517+
: maybe_outer_attrs CONST ident maybe_ty_ascription maybe_const_default ';' { $$ = mk_node("ConstTraitItem", 4, $1, $3, $4, $5); }
515518
;
516519

517520
maybe_const_default
@@ -590,11 +593,11 @@ item_impl
590593
{
591594
$$ = mk_node("ItemImpl", 6, $1, $3, 5, $6, $9, $10);
592595
}
593-
| maybe_unsafe IMPL generic_params trait_ref FOR ty maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
596+
| maybe_unsafe IMPL generic_params trait_ref FOR ty_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
594597
{
595598
$$ = mk_node("ItemImpl", 6, $3, $4, $6, $7, $9, $10);
596599
}
597-
| maybe_unsafe IMPL generic_params '!' trait_ref FOR ty maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
600+
| maybe_unsafe IMPL generic_params '!' trait_ref FOR ty_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
598601
{
599602
$$ = mk_node("ItemImplNeg", 7, $1, $3, $5, $7, $8, $10, $11);
600603
}
@@ -620,7 +623,7 @@ impl_items
620623

621624
impl_item
622625
: impl_method
623-
| item_macro
626+
| attrs_and_vis item_macro { $$ = mk_node("ImplMacroItem", 2, $1, $2); }
624627
| impl_const
625628
| impl_type
626629
;
@@ -698,7 +701,7 @@ params
698701
;
699702

700703
param
701-
: pat ':' ty { $$ = mk_node("Arg", 2, $1, $3); }
704+
: pat ':' ty_sum { $$ = mk_node("Arg", 2, $1, $3); }
702705
;
703706

704707
inferrable_params
@@ -909,6 +912,11 @@ pat
909912
| ident '@' pat { $$ = mk_node("PatIdent", 3, mk_node("BindByValue", 1, mk_atom("MutImmutable")), $1, $3); }
910913
| binding_mode ident '@' pat { $$ = mk_node("PatIdent", 3, $1, $2, $4); }
911914
| BOX pat { $$ = mk_node("PatUniq", 1, $2); }
915+
| '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident { $$ = mk_node("PatQualifiedPath", 3, $2, $3, $6); }
916+
| SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_as_trait_ref '>' MOD_SEP ident
917+
{
918+
$$ = mk_node("PatQualifiedPath", 3, mk_node("PatQualifiedPath", 3, $2, $3, $6), $7, $10);
919+
}
912920
;
913921

914922
pats_or
@@ -981,11 +989,11 @@ pat_vec_elts
981989
ty
982990
: ty_prim
983991
| ty_closure
984-
| '<' ty_sum AS trait_ref '>' MOD_SEP ident { $$ = mk_node("TyQualifiedPath", 3, $2, $4, $7); }
985-
| SHL ty_sum AS trait_ref '>' MOD_SEP ident AS trait_ref '>' MOD_SEP ident { $$ = mk_node("TyQualifiedPath", 3, mk_node("TyQualifiedPath", 3, $2, $4, $7), $9, $12); }
986-
| '(' ty_sums ')' { $$ = mk_node("TyTup", 1, $2); }
987-
| '(' ty_sums ',' ')' { $$ = mk_node("TyTup", 1, $2); }
988-
| '(' ')' { $$ = mk_atom("TyNil"); }
992+
| '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident { $$ = mk_node("TyQualifiedPath", 3, $2, $3, $6); }
993+
| SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_as_trait_ref '>' MOD_SEP ident { $$ = mk_node("TyQualifiedPath", 3, mk_node("TyQualifiedPath", 3, $2, $3, $6), $7, $10); }
994+
| '(' ty_sums ')' { $$ = mk_node("TyTup", 1, $2); }
995+
| '(' ty_sums ',' ')' { $$ = mk_node("TyTup", 1, $2); }
996+
| '(' ')' { $$ = mk_atom("TyNil"); }
989997
;
990998

991999
ty_prim
@@ -1551,11 +1559,7 @@ nonblock_prefix_expr
15511559
;
15521560

15531561
expr_qualified_path
1554-
: '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident
1555-
{
1556-
$$ = mk_node("ExprQualifiedPath", 3, $2, $3, $6);
1557-
}
1558-
| '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident generic_args
1562+
: '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_qpath_params
15591563
{
15601564
$$ = mk_node("ExprQualifiedPath", 4, $2, $3, $6, $7);
15611565
}
@@ -1576,6 +1580,11 @@ expr_qualified_path
15761580
$$ = mk_node("ExprQualifiedPath", 4, mk_node("ExprQualifiedPath", 4, $2, $3, $6, $7), $8, $11, $12);
15771581
}
15781582

1583+
maybe_qpath_params
1584+
: MOD_SEP generic_args { $$ = $2; }
1585+
| %empty { $$ = mk_none(); }
1586+
;
1587+
15791588
maybe_as_trait_ref
15801589
: AS trait_ref { $$ = $2; }
15811590
| %empty { $$ = mk_none(); }
@@ -1666,8 +1675,10 @@ block_expr
16661675

16671676
full_block_expr
16681677
: block_expr
1669-
| full_block_expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
1670-
| full_block_expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1678+
| full_block_expr '.' path_generic_args_with_colons %prec IDENT { $$ = mk_node("ExprField", 2, $1, $3); }
1679+
| full_block_expr '.' path_generic_args_with_colons '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 3, $1, $3, $5); }
1680+
| full_block_expr '.' path_generic_args_with_colons '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 3, $1, $3, $5); }
1681+
| full_block_expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
16711682
;
16721683

16731684
expr_match

0 commit comments

Comments
 (0)