1 // Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
12 #define YYERROR_VERBOSE
13 #define YYSTYPE struct node *
16 extern void yyerror(char const *s);
17 extern struct node *mk_node(char const *name, int n, ...);
18 extern struct node *mk_atom(char *text);
19 extern struct node *mk_none();
20 extern struct node *ext_node(struct node *nd, int n, ...);
21 extern void push_back(char c);
57 %token LIT_BYTE_STR_RAW
117 %token INNER_DOC_COMMENT
118 %token OUTER_DOC_COMMENT
122 %token STATIC_LIFETIME
125 Quoting from the Bison manual:
127 "Finally, the resolution of conflicts works by comparing the precedence
128 of the rule being considered with that of the lookahead token. If the
129 token's precedence is higher, the choice is to shift. If the rule's
130 precedence is higher, the choice is to reduce. If they have equal
131 precedence, the choice is made based on the associativity of that
132 precedence level. The verbose output file made by ā-vā (see Invoking
133 Bison) says how each conflict was resolved"
136 // We expect no shift/reduce or reduce/reduce conflicts in this grammar;
137 // all potential ambiguities are scrutinized and eliminated manually.
140 // fake-precedence symbol to cause '|' bars in lambda context to parse
141 // at low precedence, permit things like |x| foo = bar, where '=' is
142 // otherwise lower-precedence than '|'. Also used for proc() to cause
143 // things like proc() a + b to parse as proc() { a + b }.
148 // MUT should be lower precedence than IDENT so that in the pat rule,
149 // "& MUT pat" has higher precedence than "binding_mode ident [@ pat]"
152 // IDENT needs to be lower than '{' so that 'foo {' is shifted when
153 // trying to decide if we've got a struct-construction expr (esp. in
154 // contexts like 'if foo { .')
156 // IDENT also needs to be lower precedence than '<' so that '<' in
157 // 'foo:bar . <' is shifted (in a trait reference occurring in a
158 // bounds list), parsing as foo:(bar<baz>) rather than (foo:bar)<baz>.
160 // Put the weak keywords that can be used as idents here as well
165 // A couple fake-precedence symbols to use in rules associated with +
166 // and < in trailing type contexts. These come up when you have a type
167 // in the RHS of operator-AS, such as "foo as bar<baz>". The "<" there
168 // has to be shifted so the parser keeps trying to parse a type, even
169 // though it might well consider reducing the type "bar" and then
170 // going on to "<" as a subsequent binop. The "+" case is with
171 // trailing type-bounds ("foo as bar:A+B"), for the same reason.
172 %precedence SHIFTPLUS
175 %precedence RARROW ':'
177 // In where clauses, "for" should have greater precedence when used as
178 // a higher ranked constraint than when used as the beginning of a
179 // for_in_type (which is a ty)
183 // Binops & unops, and their precedences
188 // RETURN needs to be lower-precedence than tokens that start
190 %precedence RETURN YIELD
192 %right '=' SHLEQ SHREQ MINUSEQ ANDEQ OREQ PLUSEQ STAREQ SLASHEQ CARETEQ PERCENTEQ
207 %precedence '{' '[' '(' '.'
215 ////////////////////////////////////////////////////////////////////////
216 // Part 1: Items and attributes
217 ////////////////////////////////////////////////////////////////////////
220 : maybe_shebang inner_attrs maybe_mod_items { mk_node("crate", 2, $2, $3); }
221 | maybe_shebang maybe_mod_items { mk_node("crate", 1, $2); }
231 | %empty { $$ = mk_none(); }
235 : inner_attr { $$ = mk_node("InnerAttrs", 1, $1); }
236 | inner_attrs inner_attr { $$ = ext_node($1, 1, $2); }
240 : SHEBANG '[' meta_item ']' { $$ = mk_node("InnerAttr", 1, $3); }
241 | INNER_DOC_COMMENT { $$ = mk_node("InnerAttr", 1, mk_node("doc-comment", 1, mk_atom(yytext))); }
246 | %empty { $$ = mk_none(); }
250 : outer_attr { $$ = mk_node("OuterAttrs", 1, $1); }
251 | outer_attrs outer_attr { $$ = ext_node($1, 1, $2); }
255 : '#' '[' meta_item ']' { $$ = $3; }
256 | OUTER_DOC_COMMENT { $$ = mk_node("doc-comment", 1, mk_atom(yytext)); }
260 : ident { $$ = mk_node("MetaWord", 1, $1); }
261 | ident '=' lit { $$ = mk_node("MetaNameValue", 2, $1, $3); }
262 | ident '(' meta_seq ')' { $$ = mk_node("MetaList", 2, $1, $3); }
263 | ident '(' meta_seq ',' ')' { $$ = mk_node("MetaList", 2, $1, $3); }
267 : %empty { $$ = mk_none(); }
268 | meta_item { $$ = mk_node("MetaItems", 1, $1); }
269 | meta_seq ',' meta_item { $$ = ext_node($1, 1, $3); }
274 | %empty { $$ = mk_none(); }
278 : mod_item { $$ = mk_node("Items", 1, $1); }
279 | mod_items mod_item { $$ = ext_node($1, 1, $2); }
283 : maybe_outer_attrs visibility { $$ = mk_node("AttrsAndVis", 2, $1, $2); }
287 : attrs_and_vis item { $$ = mk_node("Item", 2, $1, $2); }
290 // items that can appear outside of a fn block
296 // items that can appear in "stmts"
306 : STATIC ident ':' ty '=' expr ';' { $$ = mk_node("ItemStatic", 3, $2, $4, $6); }
307 | STATIC MUT ident ':' ty '=' expr ';' { $$ = mk_node("ItemStatic", 3, $3, $5, $7); }
311 : CONST ident ':' ty '=' expr ';' { $$ = mk_node("ItemConst", 3, $2, $4, $6); }
315 : path_expr '!' maybe_ident parens_delimited_token_trees ';' { $$ = mk_node("ItemMacro", 3, $1, $3, $4); }
316 | path_expr '!' maybe_ident braces_delimited_token_trees { $$ = mk_node("ItemMacro", 3, $1, $3, $4); }
317 | path_expr '!' maybe_ident brackets_delimited_token_trees ';'{ $$ = mk_node("ItemMacro", 3, $1, $3, $4); }
323 | EXTERN CRATE ident ';' { $$ = mk_node("ViewItemExternCrate", 1, $3); }
324 | EXTERN CRATE ident AS ident ';' { $$ = mk_node("ViewItemExternCrate", 2, $3, $5); }
328 : EXTERN maybe_abi item_fn { $$ = mk_node("ViewItemExternFn", 2, $2, $3); }
332 : USE view_path ';' { $$ = mk_node("ViewItemUse", 1, $2); }
336 : path_no_types_allowed { $$ = mk_node("ViewPathSimple", 1, $1); }
337 | path_no_types_allowed MOD_SEP '{' '}' { $$ = mk_node("ViewPathList", 2, $1, mk_atom("ViewPathListEmpty")); }
338 | MOD_SEP '{' '}' { $$ = mk_node("ViewPathList", 1, mk_atom("ViewPathListEmpty")); }
339 | path_no_types_allowed MOD_SEP '{' idents_or_self '}' { $$ = mk_node("ViewPathList", 2, $1, $4); }
340 | MOD_SEP '{' idents_or_self '}' { $$ = mk_node("ViewPathList", 1, $3); }
341 | path_no_types_allowed MOD_SEP '{' idents_or_self ',' '}' { $$ = mk_node("ViewPathList", 2, $1, $4); }
342 | MOD_SEP '{' idents_or_self ',' '}' { $$ = mk_node("ViewPathList", 1, $3); }
343 | path_no_types_allowed MOD_SEP '*' { $$ = mk_node("ViewPathGlob", 1, $1); }
344 | MOD_SEP '*' { $$ = mk_atom("ViewPathGlob"); }
345 | '*' { $$ = mk_atom("ViewPathGlob"); }
346 | '{' '}' { $$ = mk_atom("ViewPathListEmpty"); }
347 | '{' idents_or_self '}' { $$ = mk_node("ViewPathList", 1, $2); }
348 | '{' idents_or_self ',' '}' { $$ = mk_node("ViewPathList", 1, $2); }
349 | path_no_types_allowed AS ident { $$ = mk_node("ViewPathSimple", 2, $1, $3); }
356 | item_foreign_mod { $$ = mk_node("ItemForeignMod", 1, $1); }
365 : ':' ty_sum { $$ = $2; }
366 | %empty { $$ = mk_none(); }
370 : '=' expr { $$ = $2; }
371 | %empty { $$ = mk_none(); }
376 : STRUCT ident generic_params maybe_where_clause struct_decl_args
378 $$ = mk_node("ItemStruct", 4, $2, $3, $4, $5);
380 | STRUCT ident generic_params struct_tuple_args maybe_where_clause ';'
382 $$ = mk_node("ItemStruct", 4, $2, $3, $4, $5);
384 | STRUCT ident generic_params maybe_where_clause ';'
386 $$ = mk_node("ItemStruct", 3, $2, $3, $4);
391 : '{' struct_decl_fields '}' { $$ = $2; }
392 | '{' struct_decl_fields ',' '}' { $$ = $2; }
396 : '(' struct_tuple_fields ')' { $$ = $2; }
397 | '(' struct_tuple_fields ',' ')' { $$ = $2; }
401 : struct_decl_field { $$ = mk_node("StructFields", 1, $1); }
402 | struct_decl_fields ',' struct_decl_field { $$ = ext_node($1, 1, $3); }
403 | %empty { $$ = mk_none(); }
407 : attrs_and_vis ident ':' ty_sum { $$ = mk_node("StructField", 3, $1, $2, $4); }
411 : struct_tuple_field { $$ = mk_node("StructFields", 1, $1); }
412 | struct_tuple_fields ',' struct_tuple_field { $$ = ext_node($1, 1, $3); }
413 | %empty { $$ = mk_none(); }
417 : attrs_and_vis ty_sum { $$ = mk_node("StructField", 2, $1, $2); }
422 : ENUM ident generic_params maybe_where_clause '{' enum_defs '}' { $$ = mk_node("ItemEnum", 0); }
423 | ENUM ident generic_params maybe_where_clause '{' enum_defs ',' '}' { $$ = mk_node("ItemEnum", 0); }
427 : enum_def { $$ = mk_node("EnumDefs", 1, $1); }
428 | enum_defs ',' enum_def { $$ = ext_node($1, 1, $3); }
429 | %empty { $$ = mk_none(); }
433 : attrs_and_vis ident enum_args { $$ = mk_node("EnumDef", 3, $1, $2, $3); }
437 : '{' struct_decl_fields '}' { $$ = mk_node("EnumArgs", 1, $2); }
438 | '{' struct_decl_fields ',' '}' { $$ = mk_node("EnumArgs", 1, $2); }
439 | '(' maybe_ty_sums ')' { $$ = mk_node("EnumArgs", 1, $2); }
440 | '=' expr { $$ = mk_node("EnumArgs", 1, $2); }
441 | %empty { $$ = mk_none(); }
446 : UNION ident generic_params maybe_where_clause '{' struct_decl_fields '}' { $$ = mk_node("ItemUnion", 0); }
447 | UNION ident generic_params maybe_where_clause '{' struct_decl_fields ',' '}' { $$ = mk_node("ItemUnion", 0); }
450 : MOD ident ';' { $$ = mk_node("ItemMod", 1, $2); }
451 | MOD ident '{' maybe_mod_items '}' { $$ = mk_node("ItemMod", 2, $2, $4); }
452 | MOD ident '{' inner_attrs maybe_mod_items '}' { $$ = mk_node("ItemMod", 3, $2, $4, $5); }
456 : EXTERN maybe_abi '{' maybe_foreign_items '}' { $$ = mk_node("ItemForeignMod", 1, $4); }
457 | EXTERN maybe_abi '{' inner_attrs maybe_foreign_items '}' { $$ = mk_node("ItemForeignMod", 2, $4, $5); }
462 | %empty { $$ = mk_none(); }
467 | %empty { $$ = mk_none(); }
471 : foreign_item { $$ = mk_node("ForeignItems", 1, $1); }
472 | foreign_items foreign_item { $$ = ext_node($1, 1, $2); }
476 : attrs_and_vis STATIC item_foreign_static { $$ = mk_node("ForeignItem", 2, $1, $3); }
477 | attrs_and_vis item_foreign_fn { $$ = mk_node("ForeignItem", 2, $1, $2); }
478 | attrs_and_vis UNSAFE item_foreign_fn { $$ = mk_node("ForeignItem", 2, $1, $3); }
482 : maybe_mut ident ':' ty ';' { $$ = mk_node("StaticItem", 3, $1, $2, $4); }
486 : FN ident generic_params fn_decl_allow_variadic maybe_where_clause ';' { $$ = mk_node("ForeignFn", 4, $2, $3, $4, $5); }
489 fn_decl_allow_variadic
490 : fn_params_allow_variadic ret_ty { $$ = mk_node("FnDecl", 2, $1, $2); }
493 fn_params_allow_variadic
494 : '(' ')' { $$ = mk_none(); }
495 | '(' params ')' { $$ = $2; }
496 | '(' params ',' ')' { $$ = $2; }
497 | '(' params ',' DOTDOTDOT ')' { $$ = $2; }
501 : PUB { $$ = mk_atom("Public"); }
502 | %empty { $$ = mk_atom("Inherited"); }
506 : ident_or_self { $$ = mk_node("IdentsOrSelf", 1, $1); }
507 | idents_or_self AS ident { $$ = mk_node("IdentsOrSelf", 2, $1, $3); }
508 | idents_or_self ',' ident_or_self { $$ = ext_node($1, 1, $3); }
513 | SELF { $$ = mk_atom(yytext); }
517 : TYPE ident generic_params maybe_where_clause '=' ty_sum ';' { $$ = mk_node("ItemTy", 4, $2, $3, $4, $6); }
521 : FOR '?' ident { $$ = mk_node("ForSized", 1, $3); }
522 | FOR ident '?' { $$ = mk_node("ForSized", 1, $2); }
523 | %empty { $$ = mk_none(); }
527 : maybe_unsafe TRAIT ident generic_params for_sized maybe_ty_param_bounds maybe_where_clause '{' maybe_trait_items '}'
529 $$ = mk_node("ItemTrait", 7, $1, $3, $4, $5, $6, $7, $9);
535 | %empty { $$ = mk_none(); }
539 : trait_item { $$ = mk_node("TraitItems", 1, $1); }
540 | trait_items trait_item { $$ = ext_node($1, 1, $2); }
547 | maybe_outer_attrs item_macro { $$ = mk_node("TraitMacroItem", 2, $1, $2); }
551 : maybe_outer_attrs CONST ident maybe_ty_ascription maybe_const_default ';' { $$ = mk_node("ConstTraitItem", 4, $1, $3, $4, $5); }
555 : '=' expr { $$ = mk_node("ConstDefault", 1, $2); }
556 | %empty { $$ = mk_none(); }
560 : maybe_outer_attrs TYPE ty_param ';' { $$ = mk_node("TypeTraitItem", 2, $1, $3); }
564 : UNSAFE { $$ = mk_atom("Unsafe"); }
565 | %empty { $$ = mk_none(); }
568 maybe_default_maybe_unsafe
569 : DEFAULT UNSAFE { $$ = mk_atom("DefaultUnsafe"); }
570 | DEFAULT { $$ = mk_atom("Default"); }
571 | UNSAFE { $$ = mk_atom("Unsafe"); }
572 | %empty { $$ = mk_none(); }
575 : type_method { $$ = mk_node("Required", 1, $1); }
576 | method { $$ = mk_node("Provided", 1, $1); }
580 : maybe_outer_attrs maybe_unsafe FN ident generic_params fn_decl_with_self_allow_anon_params maybe_where_clause ';'
582 $$ = mk_node("TypeMethod", 6, $1, $2, $4, $5, $6, $7);
584 | maybe_outer_attrs CONST maybe_unsafe FN ident generic_params fn_decl_with_self_allow_anon_params maybe_where_clause ';'
586 $$ = mk_node("TypeMethod", 6, $1, $3, $5, $6, $7, $8);
588 | maybe_outer_attrs maybe_unsafe EXTERN maybe_abi FN ident generic_params fn_decl_with_self_allow_anon_params maybe_where_clause ';'
590 $$ = mk_node("TypeMethod", 7, $1, $2, $4, $6, $7, $8, $9);
595 : maybe_outer_attrs maybe_unsafe FN ident generic_params fn_decl_with_self_allow_anon_params maybe_where_clause inner_attrs_and_block
597 $$ = mk_node("Method", 7, $1, $2, $4, $5, $6, $7, $8);
599 | maybe_outer_attrs CONST maybe_unsafe FN ident generic_params fn_decl_with_self_allow_anon_params maybe_where_clause inner_attrs_and_block
601 $$ = mk_node("Method", 7, $1, $3, $5, $6, $7, $8, $9);
603 | maybe_outer_attrs maybe_unsafe EXTERN maybe_abi FN ident generic_params fn_decl_with_self_allow_anon_params maybe_where_clause inner_attrs_and_block
605 $$ = mk_node("Method", 8, $1, $2, $4, $6, $7, $8, $9, $10);
610 : attrs_and_vis maybe_default maybe_unsafe FN ident generic_params fn_decl_with_self maybe_where_clause inner_attrs_and_block
612 $$ = mk_node("Method", 8, $1, $2, $3, $5, $6, $7, $8, $9);
614 | attrs_and_vis maybe_default CONST maybe_unsafe FN ident generic_params fn_decl_with_self maybe_where_clause inner_attrs_and_block
616 $$ = mk_node("Method", 8, $1, $2, $4, $6, $7, $8, $9, $10);
618 | attrs_and_vis maybe_default maybe_unsafe EXTERN maybe_abi FN ident generic_params fn_decl_with_self maybe_where_clause inner_attrs_and_block
620 $$ = mk_node("Method", 9, $1, $2, $3, $5, $7, $8, $9, $10, $11);
624 // There are two forms of impl:
626 // impl (<...>)? TY { ... }
627 // impl (<...>)? TRAIT for TY { ... }
629 // Unfortunately since TY can begin with '<' itself -- as part of a
630 // TyQualifiedPath type -- there's an s/r conflict when we see '<' after IMPL:
631 // should we reduce one of the early rules of TY (such as maybe_once)
632 // or shall we continue shifting into the generic_params list for the
635 // The production parser disambiguates a different case here by
636 // permitting / requiring the user to provide parens around types when
637 // they are ambiguous with traits. We do the same here, regrettably,
638 // by splitting ty into ty and ty_prim.
640 : maybe_default_maybe_unsafe IMPL generic_params ty_prim_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
642 $$ = mk_node("ItemImpl", 6, $1, $3, $4, $5, $7, $8);
644 | maybe_default_maybe_unsafe IMPL generic_params '(' ty ')' maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
646 $$ = mk_node("ItemImpl", 6, $1, $3, 5, $6, $9, $10);
648 | maybe_default_maybe_unsafe IMPL generic_params trait_ref FOR ty_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
650 $$ = mk_node("ItemImpl", 6, $3, $4, $6, $7, $9, $10);
652 | maybe_default_maybe_unsafe IMPL generic_params '!' trait_ref FOR ty_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
654 $$ = mk_node("ItemImplNeg", 7, $1, $3, $5, $7, $8, $10, $11);
656 | maybe_default_maybe_unsafe IMPL generic_params trait_ref FOR DOTDOT '{' '}'
658 $$ = mk_node("ItemImplDefault", 3, $1, $3, $4);
660 | maybe_default_maybe_unsafe IMPL generic_params '!' trait_ref FOR DOTDOT '{' '}'
662 $$ = mk_node("ItemImplDefaultNeg", 3, $1, $3, $4);
668 | %empty { $$ = mk_none(); }
672 : impl_item { $$ = mk_node("ImplItems", 1, $1); }
673 | impl_item impl_items { $$ = ext_node($1, 1, $2); }
678 | attrs_and_vis item_macro { $$ = mk_node("ImplMacroItem", 2, $1, $2); }
684 : DEFAULT { $$ = mk_atom("Default"); }
685 | %empty { $$ = mk_none(); }
689 : attrs_and_vis maybe_default item_const { $$ = mk_node("ImplConst", 3, $1, $2, $3); }
693 : attrs_and_vis maybe_default TYPE ident generic_params '=' ty_sum ';' { $$ = mk_node("ImplType", 5, $1, $2, $4, $5, $7); }
697 : FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block
699 $$ = mk_node("ItemFn", 5, $2, $3, $4, $5, $6);
701 | CONST FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block
703 $$ = mk_node("ItemFn", 5, $3, $4, $5, $6, $7);
708 : UNSAFE FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block
710 $$ = mk_node("ItemUnsafeFn", 5, $3, $4, $5, $6, $7);
712 | CONST UNSAFE FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block
714 $$ = mk_node("ItemUnsafeFn", 5, $4, $5, $6, $7, $8);
716 | UNSAFE EXTERN maybe_abi FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block
718 $$ = mk_node("ItemUnsafeFn", 6, $3, $5, $6, $7, $8, $9);
723 : fn_params ret_ty { $$ = mk_node("FnDecl", 2, $1, $2); }
727 : fn_params_with_self ret_ty { $$ = mk_node("FnDecl", 2, $1, $2); }
730 fn_decl_with_self_allow_anon_params
731 : fn_anon_params_with_self ret_ty { $$ = mk_node("FnDecl", 2, $1, $2); }
735 : '(' maybe_params ')' { $$ = $2; }
739 : '(' anon_param anon_params_allow_variadic_tail ')' { $$ = ext_node($2, 1, $3); }
740 | '(' ')' { $$ = mk_none(); }
744 : '(' maybe_mut SELF maybe_ty_ascription maybe_comma_params ')' { $$ = mk_node("SelfValue", 3, $2, $4, $5); }
745 | '(' '&' maybe_mut SELF maybe_ty_ascription maybe_comma_params ')' { $$ = mk_node("SelfRegion", 3, $3, $5, $6); }
746 | '(' '&' lifetime maybe_mut SELF maybe_ty_ascription maybe_comma_params ')' { $$ = mk_node("SelfRegion", 4, $3, $4, $6, $7); }
747 | '(' maybe_params ')' { $$ = mk_node("SelfStatic", 1, $2); }
750 fn_anon_params_with_self
751 : '(' maybe_mut SELF maybe_ty_ascription maybe_comma_anon_params ')' { $$ = mk_node("SelfValue", 3, $2, $4, $5); }
752 | '(' '&' maybe_mut SELF maybe_ty_ascription maybe_comma_anon_params ')' { $$ = mk_node("SelfRegion", 3, $3, $5, $6); }
753 | '(' '&' lifetime maybe_mut SELF maybe_ty_ascription maybe_comma_anon_params ')' { $$ = mk_node("SelfRegion", 4, $3, $4, $6, $7); }
754 | '(' maybe_anon_params ')' { $$ = mk_node("SelfStatic", 1, $2); }
760 | %empty { $$ = mk_none(); }
764 : param { $$ = mk_node("Args", 1, $1); }
765 | params ',' param { $$ = ext_node($1, 1, $3); }
769 : pat ':' ty_sum { $$ = mk_node("Arg", 2, $1, $3); }
773 : inferrable_param { $$ = mk_node("InferrableParams", 1, $1); }
774 | inferrable_params ',' inferrable_param { $$ = ext_node($1, 1, $3); }
778 : pat maybe_ty_ascription { $$ = mk_node("InferrableParam", 2, $1, $2); }
782 : ',' { $$ = mk_none(); }
783 | ',' params { $$ = $2; }
784 | ',' params ',' { $$ = $2; }
785 | %empty { $$ = mk_none(); }
788 maybe_comma_anon_params
789 : ',' { $$ = mk_none(); }
790 | ',' anon_params { $$ = $2; }
791 | ',' anon_params ',' { $$ = $2; }
792 | %empty { $$ = mk_none(); }
798 | %empty { $$ = mk_none(); }
802 : anon_param { $$ = mk_node("Args", 1, $1); }
803 | anon_params ',' anon_param { $$ = ext_node($1, 1, $3); }
806 // anon means it's allowed to be anonymous (type-only), but it can
809 : named_arg ':' ty { $$ = mk_node("Arg", 2, $1, $3); }
813 anon_params_allow_variadic_tail
814 : ',' DOTDOTDOT { $$ = mk_none(); }
815 | ',' anon_param anon_params_allow_variadic_tail { $$ = mk_node("Args", 2, $2, $3); }
816 | %empty { $$ = mk_none(); }
821 | UNDERSCORE { $$ = mk_atom("PatWild"); }
822 | '&' ident { $$ = $2; }
823 | '&' UNDERSCORE { $$ = mk_atom("PatWild"); }
824 | ANDAND ident { $$ = $2; }
825 | ANDAND UNDERSCORE { $$ = mk_atom("PatWild"); }
826 | MUT ident { $$ = $2; }
830 : RARROW '!' { $$ = mk_none(); }
831 | RARROW ty { $$ = mk_node("ret-ty", 1, $2); }
832 | %prec IDENT %empty { $$ = mk_none(); }
836 : '<' '>' { $$ = mk_node("Generics", 2, mk_none(), mk_none()); }
837 | '<' lifetimes '>' { $$ = mk_node("Generics", 2, $2, mk_none()); }
838 | '<' lifetimes ',' '>' { $$ = mk_node("Generics", 2, $2, mk_none()); }
839 | '<' lifetimes SHR { push_back('>'); $$ = mk_node("Generics", 2, $2, mk_none()); }
840 | '<' lifetimes ',' SHR { push_back('>'); $$ = mk_node("Generics", 2, $2, mk_none()); }
841 | '<' lifetimes ',' ty_params '>' { $$ = mk_node("Generics", 2, $2, $4); }
842 | '<' lifetimes ',' ty_params ',' '>' { $$ = mk_node("Generics", 2, $2, $4); }
843 | '<' lifetimes ',' ty_params SHR { push_back('>'); $$ = mk_node("Generics", 2, $2, $4); }
844 | '<' lifetimes ',' ty_params ',' SHR { push_back('>'); $$ = mk_node("Generics", 2, $2, $4); }
845 | '<' ty_params '>' { $$ = mk_node("Generics", 2, mk_none(), $2); }
846 | '<' ty_params ',' '>' { $$ = mk_node("Generics", 2, mk_none(), $2); }
847 | '<' ty_params SHR { push_back('>'); $$ = mk_node("Generics", 2, mk_none(), $2); }
848 | '<' ty_params ',' SHR { push_back('>'); $$ = mk_node("Generics", 2, mk_none(), $2); }
849 | %empty { $$ = mk_none(); }
853 : %empty { $$ = mk_none(); }
858 : WHERE where_predicates { $$ = mk_node("WhereClause", 1, $2); }
859 | WHERE where_predicates ',' { $$ = mk_node("WhereClause", 1, $2); }
863 : where_predicate { $$ = mk_node("WherePredicates", 1, $1); }
864 | where_predicates ',' where_predicate { $$ = ext_node($1, 1, $3); }
868 : maybe_for_lifetimes lifetime ':' bounds { $$ = mk_node("WherePredicate", 3, $1, $2, $4); }
869 | maybe_for_lifetimes ty ':' ty_param_bounds { $$ = mk_node("WherePredicate", 3, $1, $2, $4); }
873 : FOR '<' lifetimes '>' { $$ = mk_none(); }
874 | %prec FORTYPE %empty { $$ = mk_none(); }
877 : ty_param { $$ = mk_node("TyParams", 1, $1); }
878 | ty_params ',' ty_param { $$ = ext_node($1, 1, $3); }
881 // A path with no type parameters; e.g. `foo::bar::Baz`
883 // These show up in 'use' view-items, because these are processed
884 // without respect to types.
885 path_no_types_allowed
886 : ident { $$ = mk_node("ViewPath", 1, $1); }
887 | MOD_SEP ident { $$ = mk_node("ViewPath", 1, $2); }
888 | SELF { $$ = mk_node("ViewPath", 1, mk_atom("Self")); }
889 | MOD_SEP SELF { $$ = mk_node("ViewPath", 1, mk_atom("Self")); }
890 | SUPER { $$ = mk_node("ViewPath", 1, mk_atom("Super")); }
891 | MOD_SEP SUPER { $$ = mk_node("ViewPath", 1, mk_atom("Super")); }
892 | path_no_types_allowed MOD_SEP ident { $$ = ext_node($1, 1, $3); }
895 // A path with a lifetime and type parameters, with no double colons
896 // before the type parameters; e.g. `foo::bar<'a>::Baz<T>`
898 // These show up in "trait references", the components of
899 // type-parameter bounds lists, as well as in the prefix of the
900 // path_generic_args_and_bounds rule, which is the full form of a
901 // named typed expression.
903 // They do not have (nor need) an extra '::' before '<' because
904 // unlike in expr context, there are no "less-than" type exprs to
905 // be ambiguous with.
906 path_generic_args_without_colons
908 ident { $$ = mk_node("components", 1, $1); }
910 ident generic_args { $$ = mk_node("components", 2, $1, $2); }
912 ident '(' maybe_ty_sums ')' ret_ty { $$ = mk_node("components", 2, $1, $3); }
914 path_generic_args_without_colons MOD_SEP ident { $$ = ext_node($1, 1, $3); }
916 path_generic_args_without_colons MOD_SEP ident generic_args { $$ = ext_node($1, 2, $3, $4); }
918 path_generic_args_without_colons MOD_SEP ident '(' maybe_ty_sums ')' ret_ty { $$ = ext_node($1, 2, $3, $5); }
922 : '<' generic_values '>' { $$ = $2; }
923 | '<' generic_values SHR { push_back('>'); $$ = $2; }
924 | '<' generic_values GE { push_back('='); $$ = $2; }
925 | '<' generic_values SHREQ { push_back('>'); push_back('='); $$ = $2; }
926 // If generic_args starts with "<<", the first arg must be a
927 // TyQualifiedPath because that's the only type that can start with a
928 // '<'. This rule parses that as the first ty_sum and then continues
929 // with the rest of generic_values.
930 | SHL ty_qualified_path_and_generic_values '>' { $$ = $2; }
931 | SHL ty_qualified_path_and_generic_values SHR { push_back('>'); $$ = $2; }
932 | SHL ty_qualified_path_and_generic_values GE { push_back('='); $$ = $2; }
933 | SHL ty_qualified_path_and_generic_values SHREQ { push_back('>'); push_back('='); $$ = $2; }
937 : maybe_ty_sums_and_or_bindings { $$ = mk_node("GenericValues", 1, $1); }
940 maybe_ty_sums_and_or_bindings
943 | ty_sums ',' bindings { $$ = mk_node("TySumsAndBindings", 2, $1, $3); }
946 | %empty { $$ = mk_none(); }
950 : ',' bindings { $$ = $2; }
951 | %empty { $$ = mk_none(); }
954 ////////////////////////////////////////////////////////////////////////
956 ////////////////////////////////////////////////////////////////////////
959 : UNDERSCORE { $$ = mk_atom("PatWild"); }
960 | '&' pat { $$ = mk_node("PatRegion", 1, $2); }
961 | '&' MUT pat { $$ = mk_node("PatRegion", 1, $3); }
962 | ANDAND pat { $$ = mk_node("PatRegion", 1, mk_node("PatRegion", 1, $2)); }
963 | '(' ')' { $$ = mk_atom("PatUnit"); }
964 | '(' pat_tup ')' { $$ = mk_node("PatTup", 1, $2); }
965 | '[' pat_vec ']' { $$ = mk_node("PatVec", 1, $2); }
967 | lit_or_path DOTDOTDOT lit_or_path { $$ = mk_node("PatRange", 2, $1, $3); }
968 | path_expr '{' pat_struct '}' { $$ = mk_node("PatStruct", 2, $1, $3); }
969 | path_expr '(' ')' { $$ = mk_node("PatEnum", 2, $1, mk_none()); }
970 | path_expr '(' pat_tup ')' { $$ = mk_node("PatEnum", 2, $1, $3); }
971 | path_expr '!' maybe_ident delimited_token_trees { $$ = mk_node("PatMac", 3, $1, $3, $4); }
972 | binding_mode ident { $$ = mk_node("PatIdent", 2, $1, $2); }
973 | ident '@' pat { $$ = mk_node("PatIdent", 3, mk_node("BindByValue", 1, mk_atom("MutImmutable")), $1, $3); }
974 | binding_mode ident '@' pat { $$ = mk_node("PatIdent", 3, $1, $2, $4); }
975 | BOX pat { $$ = mk_node("PatUniq", 1, $2); }
976 | '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident { $$ = mk_node("PatQualifiedPath", 3, $2, $3, $6); }
977 | SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_as_trait_ref '>' MOD_SEP ident
979 $$ = mk_node("PatQualifiedPath", 3, mk_node("PatQualifiedPath", 3, $2, $3, $6), $7, $10);
984 : pat { $$ = mk_node("Pats", 1, $1); }
985 | pats_or '|' pat { $$ = ext_node($1, 1, $3); }
989 : REF { $$ = mk_node("BindByRef", 1, mk_atom("MutImmutable")); }
990 | REF MUT { $$ = mk_node("BindByRef", 1, mk_atom("MutMutable")); }
991 | MUT { $$ = mk_node("BindByValue", 1, mk_atom("MutMutable")); }
995 : path_expr { $$ = mk_node("PatLit", 1, $1); }
996 | lit { $$ = mk_node("PatLit", 1, $1); }
997 | '-' lit { $$ = mk_node("PatLit", 1, $2); }
1001 : ident { $$ = mk_node("PatField", 1, $1); }
1002 | binding_mode ident { $$ = mk_node("PatField", 2, $1, $2); }
1003 | BOX ident { $$ = mk_node("PatField", 2, mk_atom("box"), $2); }
1004 | BOX binding_mode ident { $$ = mk_node("PatField", 3, mk_atom("box"), $2, $3); }
1005 | ident ':' pat { $$ = mk_node("PatField", 2, $1, $3); }
1006 | binding_mode ident ':' pat { $$ = mk_node("PatField", 3, $1, $2, $4); }
1007 | LIT_INTEGER ':' pat { $$ = mk_node("PatField", 2, mk_atom(yytext), $3); }
1011 : pat_field { $$ = mk_node("PatFields", 1, $1); }
1012 | pat_fields ',' pat_field { $$ = ext_node($1, 1, $3); }
1016 : pat_fields { $$ = mk_node("PatStruct", 2, $1, mk_atom("false")); }
1017 | pat_fields ',' { $$ = mk_node("PatStruct", 2, $1, mk_atom("false")); }
1018 | pat_fields ',' DOTDOT { $$ = mk_node("PatStruct", 2, $1, mk_atom("true")); }
1019 | DOTDOT { $$ = mk_node("PatStruct", 1, mk_atom("true")); }
1020 | %empty { $$ = mk_node("PatStruct", 1, mk_none()); }
1024 : pat_tup_elts { $$ = mk_node("PatTup", 2, $1, mk_none()); }
1025 | pat_tup_elts ',' { $$ = mk_node("PatTup", 2, $1, mk_none()); }
1026 | pat_tup_elts DOTDOT { $$ = mk_node("PatTup", 2, $1, mk_none()); }
1027 | pat_tup_elts ',' DOTDOT { $$ = mk_node("PatTup", 2, $1, mk_none()); }
1028 | pat_tup_elts DOTDOT ',' pat_tup_elts { $$ = mk_node("PatTup", 2, $1, $4); }
1029 | pat_tup_elts DOTDOT ',' pat_tup_elts ',' { $$ = mk_node("PatTup", 2, $1, $4); }
1030 | pat_tup_elts ',' DOTDOT ',' pat_tup_elts { $$ = mk_node("PatTup", 2, $1, $5); }
1031 | pat_tup_elts ',' DOTDOT ',' pat_tup_elts ',' { $$ = mk_node("PatTup", 2, $1, $5); }
1032 | DOTDOT ',' pat_tup_elts { $$ = mk_node("PatTup", 2, mk_none(), $3); }
1033 | DOTDOT ',' pat_tup_elts ',' { $$ = mk_node("PatTup", 2, mk_none(), $3); }
1034 | DOTDOT { $$ = mk_node("PatTup", 2, mk_none(), mk_none()); }
1038 : pat { $$ = mk_node("PatTupElts", 1, $1); }
1039 | pat_tup_elts ',' pat { $$ = ext_node($1, 1, $3); }
1043 : pat_vec_elts { $$ = mk_node("PatVec", 2, $1, mk_none()); }
1044 | pat_vec_elts ',' { $$ = mk_node("PatVec", 2, $1, mk_none()); }
1045 | pat_vec_elts DOTDOT { $$ = mk_node("PatVec", 2, $1, mk_none()); }
1046 | pat_vec_elts ',' DOTDOT { $$ = mk_node("PatVec", 2, $1, mk_none()); }
1047 | pat_vec_elts DOTDOT ',' pat_vec_elts { $$ = mk_node("PatVec", 2, $1, $4); }
1048 | pat_vec_elts DOTDOT ',' pat_vec_elts ',' { $$ = mk_node("PatVec", 2, $1, $4); }
1049 | pat_vec_elts ',' DOTDOT ',' pat_vec_elts { $$ = mk_node("PatVec", 2, $1, $5); }
1050 | pat_vec_elts ',' DOTDOT ',' pat_vec_elts ',' { $$ = mk_node("PatVec", 2, $1, $5); }
1051 | DOTDOT ',' pat_vec_elts { $$ = mk_node("PatVec", 2, mk_none(), $3); }
1052 | DOTDOT ',' pat_vec_elts ',' { $$ = mk_node("PatVec", 2, mk_none(), $3); }
1053 | DOTDOT { $$ = mk_node("PatVec", 2, mk_none(), mk_none()); }
1054 | %empty { $$ = mk_node("PatVec", 2, mk_none(), mk_none()); }
1058 : pat { $$ = mk_node("PatVecElts", 1, $1); }
1059 | pat_vec_elts ',' pat { $$ = ext_node($1, 1, $3); }
1062 ////////////////////////////////////////////////////////////////////////
1064 ////////////////////////////////////////////////////////////////////////
1069 | '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident { $$ = mk_node("TyQualifiedPath", 3, $2, $3, $6); }
1070 | 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); }
1071 | '(' ty_sums ')' { $$ = mk_node("TyTup", 1, $2); }
1072 | '(' ty_sums ',' ')' { $$ = mk_node("TyTup", 1, $2); }
1073 | '(' ')' { $$ = mk_atom("TyNil"); }
1077 : %prec IDENT path_generic_args_without_colons { $$ = mk_node("TyPath", 2, mk_node("global", 1, mk_atom("false")), $1); }
1078 | %prec IDENT MOD_SEP path_generic_args_without_colons { $$ = mk_node("TyPath", 2, mk_node("global", 1, mk_atom("true")), $2); }
1079 | %prec IDENT SELF MOD_SEP path_generic_args_without_colons { $$ = mk_node("TyPath", 2, mk_node("self", 1, mk_atom("true")), $3); }
1080 | %prec IDENT path_generic_args_without_colons '!' maybe_ident delimited_token_trees { $$ = mk_node("TyMacro", 3, $1, $3, $4); }
1081 | %prec IDENT MOD_SEP path_generic_args_without_colons '!' maybe_ident delimited_token_trees { $$ = mk_node("TyMacro", 3, $2, $4, $5); }
1082 | BOX ty { $$ = mk_node("TyBox", 1, $2); }
1083 | '*' maybe_mut_or_const ty { $$ = mk_node("TyPtr", 2, $2, $3); }
1084 | '&' ty { $$ = mk_node("TyRptr", 2, mk_atom("MutImmutable"), $2); }
1085 | '&' MUT ty { $$ = mk_node("TyRptr", 2, mk_atom("MutMutable"), $3); }
1086 | ANDAND ty { $$ = mk_node("TyRptr", 1, mk_node("TyRptr", 2, mk_atom("MutImmutable"), $2)); }
1087 | ANDAND MUT ty { $$ = mk_node("TyRptr", 1, mk_node("TyRptr", 2, mk_atom("MutMutable"), $3)); }
1088 | '&' lifetime maybe_mut ty { $$ = mk_node("TyRptr", 3, $2, $3, $4); }
1089 | ANDAND lifetime maybe_mut ty { $$ = mk_node("TyRptr", 1, mk_node("TyRptr", 3, $2, $3, $4)); }
1090 | '[' ty ']' { $$ = mk_node("TyVec", 1, $2); }
1091 | '[' ty ',' DOTDOT expr ']' { $$ = mk_node("TyFixedLengthVec", 2, $2, $5); }
1092 | '[' ty ';' expr ']' { $$ = mk_node("TyFixedLengthVec", 2, $2, $4); }
1093 | TYPEOF '(' expr ')' { $$ = mk_node("TyTypeof", 1, $3); }
1094 | UNDERSCORE { $$ = mk_atom("TyInfer"); }
1100 : FN ty_fn_decl { $$ = $2; }
1101 | UNSAFE FN ty_fn_decl { $$ = $3; }
1102 | EXTERN maybe_abi FN ty_fn_decl { $$ = $4; }
1103 | UNSAFE EXTERN maybe_abi FN ty_fn_decl { $$ = $5; }
1107 : generic_params fn_anon_params ret_ty { $$ = mk_node("TyFnDecl", 3, $1, $2, $3); }
1111 : UNSAFE '|' anon_params '|' maybe_bounds ret_ty { $$ = mk_node("TyClosure", 3, $3, $5, $6); }
1112 | '|' anon_params '|' maybe_bounds ret_ty { $$ = mk_node("TyClosure", 3, $2, $4, $5); }
1113 | UNSAFE OROR maybe_bounds ret_ty { $$ = mk_node("TyClosure", 2, $3, $4); }
1114 | OROR maybe_bounds ret_ty { $$ = mk_node("TyClosure", 2, $2, $3); }
1118 : FOR '<' maybe_lifetimes '>' for_in_type_suffix { $$ = mk_node("ForInType", 2, $3, $5); }
1128 : MUT { $$ = mk_atom("MutMutable"); }
1129 | %prec MUT %empty { $$ = mk_atom("MutImmutable"); }
1133 : MUT { $$ = mk_atom("MutMutable"); }
1134 | CONST { $$ = mk_atom("MutImmutable"); }
1135 | %empty { $$ = mk_atom("MutImmutable"); }
1138 ty_qualified_path_and_generic_values
1139 : ty_qualified_path maybe_bindings
1141 $$ = mk_node("GenericValues", 3, mk_none(), mk_node("TySums", 1, mk_node("TySum", 1, $1)), $2);
1143 | ty_qualified_path ',' ty_sums maybe_bindings
1145 $$ = mk_node("GenericValues", 3, mk_none(), mk_node("TySums", 2, $1, $3), $4);
1150 : ty_sum AS trait_ref '>' MOD_SEP ident { $$ = mk_node("TyQualifiedPath", 3, $1, $3, $6); }
1151 | ty_sum AS trait_ref '>' MOD_SEP ident '+' ty_param_bounds { $$ = mk_node("TyQualifiedPath", 3, $1, $3, $6); }
1157 | %empty { $$ = mk_none(); }
1161 : ty_sum { $$ = mk_node("TySums", 1, $1); }
1162 | ty_sums ',' ty_sum { $$ = ext_node($1, 1, $3); }
1166 : ty_sum_elt { $$ = mk_node("TySum", 1, $1); }
1167 | ty_sum '+' ty_sum_elt { $$ = ext_node($1, 1, $3); }
1176 : ty_prim_sum_elt { $$ = mk_node("TySum", 1, $1); }
1177 | ty_prim_sum '+' ty_prim_sum_elt { $$ = ext_node($1, 1, $3); }
1185 maybe_ty_param_bounds
1186 : ':' ty_param_bounds { $$ = $2; }
1187 | %empty { $$ = mk_none(); }
1192 | %empty { $$ = mk_none(); }
1197 | boundseq '+' polybound { $$ = ext_node($1, 1, $3); }
1201 : FOR '<' maybe_lifetimes '>' bound { $$ = mk_node("PolyBound", 2, $3, $5); }
1203 | '?' FOR '<' maybe_lifetimes '>' bound { $$ = mk_node("PolyBound", 2, $4, $6); }
1204 | '?' bound { $$ = $2; }
1208 : binding { $$ = mk_node("Bindings", 1, $1); }
1209 | bindings ',' binding { $$ = ext_node($1, 1, $3); }
1213 : ident '=' ty { mk_node("Binding", 2, $1, $3); }
1217 : ident maybe_ty_param_bounds maybe_ty_default { $$ = mk_node("TyParam", 3, $1, $2, $3); }
1218 | ident '?' ident maybe_ty_param_bounds maybe_ty_default { $$ = mk_node("TyParam", 4, $1, $3, $4, $5); }
1223 ':' bounds { $$ = $2; }
1224 | %prec SHIFTPLUS %empty { $$ = mk_none(); }
1228 : bound { $$ = mk_node("bounds", 1, $1); }
1229 | bounds '+' bound { $$ = ext_node($1, 1, $3); }
1239 ':' ltbounds { $$ = $2; }
1240 | %empty { $$ = mk_none(); }
1244 : lifetime { $$ = mk_node("ltbounds", 1, $1); }
1245 | ltbounds '+' lifetime { $$ = ext_node($1, 1, $3); }
1249 : '=' ty_sum { $$ = mk_node("TyDefault", 1, $2); }
1250 | %empty { $$ = mk_none(); }
1256 | %empty { $$ = mk_none(); }
1260 : lifetime_and_bounds { $$ = mk_node("Lifetimes", 1, $1); }
1261 | lifetimes ',' lifetime_and_bounds { $$ = ext_node($1, 1, $3); }
1265 : LIFETIME maybe_ltbounds { $$ = mk_node("lifetime", 2, mk_atom(yytext), $2); }
1266 | STATIC_LIFETIME { $$ = mk_atom("static_lifetime"); }
1270 : LIFETIME { $$ = mk_node("lifetime", 1, mk_atom(yytext)); }
1271 | STATIC_LIFETIME { $$ = mk_atom("static_lifetime"); }
1275 : %prec IDENT path_generic_args_without_colons
1276 | %prec IDENT MOD_SEP path_generic_args_without_colons { $$ = $2; }
1279 ////////////////////////////////////////////////////////////////////////
1280 // Part 4: Blocks, statements, and expressions
1281 ////////////////////////////////////////////////////////////////////////
1283 inner_attrs_and_block
1284 : '{' maybe_inner_attrs maybe_stmts '}' { $$ = mk_node("ExprBlock", 2, $2, $3); }
1288 : '{' maybe_stmts '}' { $$ = mk_node("ExprBlock", 1, $2); }
1293 | stmts nonblock_expr { $$ = ext_node($1, 1, $2); }
1295 | %empty { $$ = mk_none(); }
1298 // There are two sub-grammars within a "stmts: exprs" derivation
1299 // depending on whether each stmt-expr is a block-expr form; this is to
1300 // handle the "semicolon rule" for stmt sequencing that permits
1303 // if foo { bar } 10
1305 // as a sequence of two stmts (one if-expr stmt, one lit-10-expr
1306 // stmt). Unfortunately by permitting juxtaposition of exprs in
1307 // sequence like that, the non-block expr grammar has to have a
1308 // second limited sub-grammar that excludes the prefix exprs that
1309 // are ambiguous with binops. That is to say:
1313 // should parse as (progn (progn 10) (- 1)) not (- (progn 10) 1), that
1314 // is to say, two statements rather than one, at least according to
1315 // the mainline rust parser.
1317 // So we wind up with a 3-way split in exprs that occur in stmt lists:
1318 // block, nonblock-prefix, and nonblock-nonprefix.
1320 // In non-stmts contexts, expr can relax this trichotomy.
1323 : stmt { $$ = mk_node("stmts", 1, $1); }
1324 | stmts stmt { $$ = ext_node($1, 1, $2); }
1328 : maybe_outer_attrs let { $$ = $2; }
1330 | PUB stmt_item { $$ = $2; }
1331 | outer_attrs stmt_item { $$ = $2; }
1332 | outer_attrs PUB stmt_item { $$ = $3; }
1334 | maybe_outer_attrs block { $$ = $2; }
1336 | outer_attrs nonblock_expr ';' { $$ = $2; }
1337 | ';' { $$ = mk_none(); }
1343 | %empty { $$ = mk_none(); }
1348 | %empty { $$ = mk_none(); }
1352 : expr { $$ = mk_node("exprs", 1, $1); }
1353 | exprs ',' expr { $$ = ext_node($1, 1, $3); }
1357 : path_generic_args_with_colons
1358 | MOD_SEP path_generic_args_with_colons { $$ = $2; }
1359 | SELF MOD_SEP path_generic_args_with_colons { $$ = mk_node("SelfPath", 1, $3); }
1362 // A path with a lifetime and type parameters with double colons before
1363 // the type parameters; e.g. `foo::bar::<'a>::Baz::<T>`
1365 // These show up in expr context, in order to disambiguate from "less-than"
1367 path_generic_args_with_colons
1368 : ident { $$ = mk_node("components", 1, $1); }
1369 | SUPER { $$ = mk_atom("Super"); }
1370 | path_generic_args_with_colons MOD_SEP ident { $$ = ext_node($1, 1, $3); }
1371 | path_generic_args_with_colons MOD_SEP SUPER { $$ = ext_node($1, 1, mk_atom("Super")); }
1372 | path_generic_args_with_colons MOD_SEP generic_args { $$ = ext_node($1, 1, $3); }
1375 // the braces-delimited macro is a block_expr so it doesn't appear here
1377 : path_expr '!' maybe_ident parens_delimited_token_trees { $$ = mk_node("MacroExpr", 3, $1, $3, $4); }
1378 | path_expr '!' maybe_ident brackets_delimited_token_trees { $$ = mk_node("MacroExpr", 3, $1, $3, $4); }
1382 : lit { $$ = mk_node("ExprLit", 1, $1); }
1384 path_expr { $$ = mk_node("ExprPath", 1, $1); }
1385 | SELF { $$ = mk_node("ExprPath", 1, mk_node("ident", 1, mk_atom("self"))); }
1386 | macro_expr { $$ = mk_node("ExprMac", 1, $1); }
1387 | path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); }
1388 | nonblock_expr '?' { $$ = mk_node("ExprTry", 1, $1); }
1389 | nonblock_expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
1390 | nonblock_expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1391 | nonblock_expr '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1392 | nonblock_expr '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
1393 | '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
1394 | '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); }
1395 | CONTINUE { $$ = mk_node("ExprAgain", 0); }
1396 | CONTINUE lifetime { $$ = mk_node("ExprAgain", 1, $2); }
1397 | RETURN { $$ = mk_node("ExprRet", 0); }
1398 | RETURN expr { $$ = mk_node("ExprRet", 1, $2); }
1399 | BREAK { $$ = mk_node("ExprBreak", 0); }
1400 | BREAK lifetime { $$ = mk_node("ExprBreak", 1, $2); }
1401 | YIELD { $$ = mk_node("ExprYield", 0); }
1402 | YIELD expr { $$ = mk_node("ExprYield", 1, $2); }
1403 | nonblock_expr LARROW expr { $$ = mk_node("ExprInPlace", 2, $1, $3); }
1404 | nonblock_expr '=' expr { $$ = mk_node("ExprAssign", 2, $1, $3); }
1405 | nonblock_expr SHLEQ expr { $$ = mk_node("ExprAssignShl", 2, $1, $3); }
1406 | nonblock_expr SHREQ expr { $$ = mk_node("ExprAssignShr", 2, $1, $3); }
1407 | nonblock_expr MINUSEQ expr { $$ = mk_node("ExprAssignSub", 2, $1, $3); }
1408 | nonblock_expr ANDEQ expr { $$ = mk_node("ExprAssignBitAnd", 2, $1, $3); }
1409 | nonblock_expr OREQ expr { $$ = mk_node("ExprAssignBitOr", 2, $1, $3); }
1410 | nonblock_expr PLUSEQ expr { $$ = mk_node("ExprAssignAdd", 2, $1, $3); }
1411 | nonblock_expr STAREQ expr { $$ = mk_node("ExprAssignMul", 2, $1, $3); }
1412 | nonblock_expr SLASHEQ expr { $$ = mk_node("ExprAssignDiv", 2, $1, $3); }
1413 | nonblock_expr CARETEQ expr { $$ = mk_node("ExprAssignBitXor", 2, $1, $3); }
1414 | nonblock_expr PERCENTEQ expr { $$ = mk_node("ExprAssignRem", 2, $1, $3); }
1415 | nonblock_expr OROR expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiOr"), $1, $3); }
1416 | nonblock_expr ANDAND expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiAnd"), $1, $3); }
1417 | nonblock_expr EQEQ expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiEq"), $1, $3); }
1418 | nonblock_expr NE expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiNe"), $1, $3); }
1419 | nonblock_expr '<' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiLt"), $1, $3); }
1420 | nonblock_expr '>' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiGt"), $1, $3); }
1421 | nonblock_expr LE expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiLe"), $1, $3); }
1422 | nonblock_expr GE expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiGe"), $1, $3); }
1423 | nonblock_expr '|' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitOr"), $1, $3); }
1424 | nonblock_expr '^' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitXor"), $1, $3); }
1425 | nonblock_expr '&' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitAnd"), $1, $3); }
1426 | nonblock_expr SHL expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiShl"), $1, $3); }
1427 | nonblock_expr SHR expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiShr"), $1, $3); }
1428 | nonblock_expr '+' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiAdd"), $1, $3); }
1429 | nonblock_expr '-' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiSub"), $1, $3); }
1430 | nonblock_expr '*' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiMul"), $1, $3); }
1431 | nonblock_expr '/' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiDiv"), $1, $3); }
1432 | nonblock_expr '%' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiRem"), $1, $3); }
1433 | nonblock_expr DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
1434 | nonblock_expr DOTDOT expr { $$ = mk_node("ExprRange", 2, $1, $3); }
1435 | DOTDOT expr { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1436 | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
1437 | nonblock_expr AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
1438 | nonblock_expr ':' ty { $$ = mk_node("ExprTypeAscr", 2, $1, $3); }
1439 | BOX expr { $$ = mk_node("ExprBox", 1, $2); }
1440 | expr_qualified_path
1441 | nonblock_prefix_expr
1445 : lit { $$ = mk_node("ExprLit", 1, $1); }
1447 path_expr { $$ = mk_node("ExprPath", 1, $1); }
1448 | SELF { $$ = mk_node("ExprPath", 1, mk_node("ident", 1, mk_atom("self"))); }
1449 | macro_expr { $$ = mk_node("ExprMac", 1, $1); }
1450 | path_expr '{' struct_expr_fields '}' { $$ = mk_node("ExprStruct", 2, $1, $3); }
1451 | expr '?' { $$ = mk_node("ExprTry", 1, $1); }
1452 | expr '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
1453 | expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1454 | expr '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1455 | expr '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
1456 | '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); }
1457 | '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
1458 | CONTINUE { $$ = mk_node("ExprAgain", 0); }
1459 | CONTINUE ident { $$ = mk_node("ExprAgain", 1, $2); }
1460 | RETURN { $$ = mk_node("ExprRet", 0); }
1461 | RETURN expr { $$ = mk_node("ExprRet", 1, $2); }
1462 | BREAK { $$ = mk_node("ExprBreak", 0); }
1463 | BREAK ident { $$ = mk_node("ExprBreak", 1, $2); }
1464 | YIELD { $$ = mk_node("ExprYield", 0); }
1465 | YIELD expr { $$ = mk_node("ExprYield", 1, $2); }
1466 | expr LARROW expr { $$ = mk_node("ExprInPlace", 2, $1, $3); }
1467 | expr '=' expr { $$ = mk_node("ExprAssign", 2, $1, $3); }
1468 | expr SHLEQ expr { $$ = mk_node("ExprAssignShl", 2, $1, $3); }
1469 | expr SHREQ expr { $$ = mk_node("ExprAssignShr", 2, $1, $3); }
1470 | expr MINUSEQ expr { $$ = mk_node("ExprAssignSub", 2, $1, $3); }
1471 | expr ANDEQ expr { $$ = mk_node("ExprAssignBitAnd", 2, $1, $3); }
1472 | expr OREQ expr { $$ = mk_node("ExprAssignBitOr", 2, $1, $3); }
1473 | expr PLUSEQ expr { $$ = mk_node("ExprAssignAdd", 2, $1, $3); }
1474 | expr STAREQ expr { $$ = mk_node("ExprAssignMul", 2, $1, $3); }
1475 | expr SLASHEQ expr { $$ = mk_node("ExprAssignDiv", 2, $1, $3); }
1476 | expr CARETEQ expr { $$ = mk_node("ExprAssignBitXor", 2, $1, $3); }
1477 | expr PERCENTEQ expr { $$ = mk_node("ExprAssignRem", 2, $1, $3); }
1478 | expr OROR expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiOr"), $1, $3); }
1479 | expr ANDAND expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiAnd"), $1, $3); }
1480 | expr EQEQ expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiEq"), $1, $3); }
1481 | expr NE expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiNe"), $1, $3); }
1482 | expr '<' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiLt"), $1, $3); }
1483 | expr '>' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiGt"), $1, $3); }
1484 | expr LE expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiLe"), $1, $3); }
1485 | expr GE expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiGe"), $1, $3); }
1486 | expr '|' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitOr"), $1, $3); }
1487 | expr '^' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitXor"), $1, $3); }
1488 | expr '&' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitAnd"), $1, $3); }
1489 | expr SHL expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiShl"), $1, $3); }
1490 | expr SHR expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiShr"), $1, $3); }
1491 | expr '+' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiAdd"), $1, $3); }
1492 | expr '-' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiSub"), $1, $3); }
1493 | expr '*' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiMul"), $1, $3); }
1494 | expr '/' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiDiv"), $1, $3); }
1495 | expr '%' expr { $$ = mk_node("ExprBinary", 3, mk_atom("BiRem"), $1, $3); }
1496 | expr DOTDOT { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
1497 | expr DOTDOT expr { $$ = mk_node("ExprRange", 2, $1, $3); }
1498 | DOTDOT expr { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1499 | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
1500 | expr AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
1501 | expr ':' ty { $$ = mk_node("ExprTypeAscr", 2, $1, $3); }
1502 | BOX expr { $$ = mk_node("ExprBox", 1, $2); }
1503 | expr_qualified_path
1506 | nonblock_prefix_expr
1510 : lit { $$ = mk_node("ExprLit", 1, $1); }
1512 path_expr { $$ = mk_node("ExprPath", 1, $1); }
1513 | SELF { $$ = mk_node("ExprPath", 1, mk_node("ident", 1, mk_atom("self"))); }
1514 | macro_expr { $$ = mk_node("ExprMac", 1, $1); }
1515 | expr_nostruct '?' { $$ = mk_node("ExprTry", 1, $1); }
1516 | expr_nostruct '.' path_generic_args_with_colons { $$ = mk_node("ExprField", 2, $1, $3); }
1517 | expr_nostruct '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1518 | expr_nostruct '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 2, $1, $3); }
1519 | expr_nostruct '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 2, $1, $3); }
1520 | '[' vec_expr ']' { $$ = mk_node("ExprVec", 1, $2); }
1521 | '(' maybe_exprs ')' { $$ = mk_node("ExprParen", 1, $2); }
1522 | CONTINUE { $$ = mk_node("ExprAgain", 0); }
1523 | CONTINUE ident { $$ = mk_node("ExprAgain", 1, $2); }
1524 | RETURN { $$ = mk_node("ExprRet", 0); }
1525 | RETURN expr { $$ = mk_node("ExprRet", 1, $2); }
1526 | BREAK { $$ = mk_node("ExprBreak", 0); }
1527 | BREAK ident { $$ = mk_node("ExprBreak", 1, $2); }
1528 | YIELD { $$ = mk_node("ExprYield", 0); }
1529 | YIELD expr { $$ = mk_node("ExprYield", 1, $2); }
1530 | expr_nostruct LARROW expr_nostruct { $$ = mk_node("ExprInPlace", 2, $1, $3); }
1531 | expr_nostruct '=' expr_nostruct { $$ = mk_node("ExprAssign", 2, $1, $3); }
1532 | expr_nostruct SHLEQ expr_nostruct { $$ = mk_node("ExprAssignShl", 2, $1, $3); }
1533 | expr_nostruct SHREQ expr_nostruct { $$ = mk_node("ExprAssignShr", 2, $1, $3); }
1534 | expr_nostruct MINUSEQ expr_nostruct { $$ = mk_node("ExprAssignSub", 2, $1, $3); }
1535 | expr_nostruct ANDEQ expr_nostruct { $$ = mk_node("ExprAssignBitAnd", 2, $1, $3); }
1536 | expr_nostruct OREQ expr_nostruct { $$ = mk_node("ExprAssignBitOr", 2, $1, $3); }
1537 | expr_nostruct PLUSEQ expr_nostruct { $$ = mk_node("ExprAssignAdd", 2, $1, $3); }
1538 | expr_nostruct STAREQ expr_nostruct { $$ = mk_node("ExprAssignMul", 2, $1, $3); }
1539 | expr_nostruct SLASHEQ expr_nostruct { $$ = mk_node("ExprAssignDiv", 2, $1, $3); }
1540 | expr_nostruct CARETEQ expr_nostruct { $$ = mk_node("ExprAssignBitXor", 2, $1, $3); }
1541 | expr_nostruct PERCENTEQ expr_nostruct { $$ = mk_node("ExprAssignRem", 2, $1, $3); }
1542 | expr_nostruct OROR expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiOr"), $1, $3); }
1543 | expr_nostruct ANDAND expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiAnd"), $1, $3); }
1544 | expr_nostruct EQEQ expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiEq"), $1, $3); }
1545 | expr_nostruct NE expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiNe"), $1, $3); }
1546 | expr_nostruct '<' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiLt"), $1, $3); }
1547 | expr_nostruct '>' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiGt"), $1, $3); }
1548 | expr_nostruct LE expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiLe"), $1, $3); }
1549 | expr_nostruct GE expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiGe"), $1, $3); }
1550 | expr_nostruct '|' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitOr"), $1, $3); }
1551 | expr_nostruct '^' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitXor"), $1, $3); }
1552 | expr_nostruct '&' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiBitAnd"), $1, $3); }
1553 | expr_nostruct SHL expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiShl"), $1, $3); }
1554 | expr_nostruct SHR expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiShr"), $1, $3); }
1555 | expr_nostruct '+' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiAdd"), $1, $3); }
1556 | expr_nostruct '-' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiSub"), $1, $3); }
1557 | expr_nostruct '*' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiMul"), $1, $3); }
1558 | expr_nostruct '/' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiDiv"), $1, $3); }
1559 | expr_nostruct '%' expr_nostruct { $$ = mk_node("ExprBinary", 3, mk_atom("BiRem"), $1, $3); }
1560 | expr_nostruct DOTDOT %prec RANGE { $$ = mk_node("ExprRange", 2, $1, mk_none()); }
1561 | expr_nostruct DOTDOT expr_nostruct { $$ = mk_node("ExprRange", 2, $1, $3); }
1562 | DOTDOT expr_nostruct { $$ = mk_node("ExprRange", 2, mk_none(), $2); }
1563 | DOTDOT { $$ = mk_node("ExprRange", 2, mk_none(), mk_none()); }
1564 | expr_nostruct AS ty { $$ = mk_node("ExprCast", 2, $1, $3); }
1565 | expr_nostruct ':' ty { $$ = mk_node("ExprTypeAscr", 2, $1, $3); }
1566 | BOX expr { $$ = mk_node("ExprBox", 1, $2); }
1567 | expr_qualified_path
1570 | nonblock_prefix_expr_nostruct
1573 nonblock_prefix_expr_nostruct
1574 : '-' expr_nostruct { $$ = mk_node("ExprUnary", 2, mk_atom("UnNeg"), $2); }
1575 | '!' expr_nostruct { $$ = mk_node("ExprUnary", 2, mk_atom("UnNot"), $2); }
1576 | '*' expr_nostruct { $$ = mk_node("ExprUnary", 2, mk_atom("UnDeref"), $2); }
1577 | '&' maybe_mut expr_nostruct { $$ = mk_node("ExprAddrOf", 2, $2, $3); }
1578 | ANDAND maybe_mut expr_nostruct { $$ = mk_node("ExprAddrOf", 1, mk_node("ExprAddrOf", 2, $2, $3)); }
1579 | lambda_expr_nostruct
1580 | MOVE lambda_expr_nostruct { $$ = $2; }
1583 nonblock_prefix_expr
1584 : '-' expr { $$ = mk_node("ExprUnary", 2, mk_atom("UnNeg"), $2); }
1585 | '!' expr { $$ = mk_node("ExprUnary", 2, mk_atom("UnNot"), $2); }
1586 | '*' expr { $$ = mk_node("ExprUnary", 2, mk_atom("UnDeref"), $2); }
1587 | '&' maybe_mut expr { $$ = mk_node("ExprAddrOf", 2, $2, $3); }
1588 | ANDAND maybe_mut expr { $$ = mk_node("ExprAddrOf", 1, mk_node("ExprAddrOf", 2, $2, $3)); }
1590 | MOVE lambda_expr { $$ = $2; }
1594 : '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_qpath_params
1596 $$ = mk_node("ExprQualifiedPath", 4, $2, $3, $6, $7);
1598 | SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_as_trait_ref '>' MOD_SEP ident
1600 $$ = mk_node("ExprQualifiedPath", 3, mk_node("ExprQualifiedPath", 3, $2, $3, $6), $7, $10);
1602 | SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident generic_args maybe_as_trait_ref '>' MOD_SEP ident
1604 $$ = mk_node("ExprQualifiedPath", 3, mk_node("ExprQualifiedPath", 4, $2, $3, $6, $7), $8, $11);
1606 | SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_as_trait_ref '>' MOD_SEP ident generic_args
1608 $$ = mk_node("ExprQualifiedPath", 4, mk_node("ExprQualifiedPath", 3, $2, $3, $6), $7, $10, $11);
1610 | SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident generic_args maybe_as_trait_ref '>' MOD_SEP ident generic_args
1612 $$ = mk_node("ExprQualifiedPath", 4, mk_node("ExprQualifiedPath", 4, $2, $3, $6, $7), $8, $11, $12);
1616 : MOD_SEP generic_args { $$ = $2; }
1617 | %empty { $$ = mk_none(); }
1621 : AS trait_ref { $$ = $2; }
1622 | %empty { $$ = mk_none(); }
1627 OROR ret_ty expr { $$ = mk_node("ExprFnBlock", 3, mk_none(), $2, $3); }
1629 '|' '|' ret_ty expr { $$ = mk_node("ExprFnBlock", 3, mk_none(), $3, $4); }
1631 '|' inferrable_params '|' ret_ty expr { $$ = mk_node("ExprFnBlock", 3, $2, $4, $5); }
1633 '|' inferrable_params OROR lambda_expr_no_first_bar { $$ = mk_node("ExprFnBlock", 3, $2, mk_none(), $4); }
1636 lambda_expr_no_first_bar
1638 '|' ret_ty expr { $$ = mk_node("ExprFnBlock", 3, mk_none(), $2, $3); }
1640 inferrable_params '|' ret_ty expr { $$ = mk_node("ExprFnBlock", 3, $1, $3, $4); }
1642 inferrable_params OROR lambda_expr_no_first_bar { $$ = mk_node("ExprFnBlock", 3, $1, mk_none(), $3); }
1645 lambda_expr_nostruct
1647 OROR expr_nostruct { $$ = mk_node("ExprFnBlock", 2, mk_none(), $2); }
1649 '|' '|' ret_ty expr_nostruct { $$ = mk_node("ExprFnBlock", 3, mk_none(), $3, $4); }
1651 '|' inferrable_params '|' expr_nostruct { $$ = mk_node("ExprFnBlock", 2, $2, $4); }
1653 '|' inferrable_params OROR lambda_expr_nostruct_no_first_bar { $$ = mk_node("ExprFnBlock", 3, $2, mk_none(), $4); }
1656 lambda_expr_nostruct_no_first_bar
1658 '|' ret_ty expr_nostruct { $$ = mk_node("ExprFnBlock", 3, mk_none(), $2, $3); }
1660 inferrable_params '|' ret_ty expr_nostruct { $$ = mk_node("ExprFnBlock", 3, $1, $3, $4); }
1662 inferrable_params OROR lambda_expr_nostruct_no_first_bar { $$ = mk_node("ExprFnBlock", 3, $1, mk_none(), $3); }
1667 | exprs ';' expr { $$ = mk_node("VecRepeat", 2, $1, $3); }
1673 | maybe_field_inits default_field_init { $$ = ext_node($1, 1, $2); }
1674 | %empty { $$ = mk_none(); }
1680 | %empty { $$ = mk_none(); }
1684 : field_init { $$ = mk_node("FieldInits", 1, $1); }
1685 | field_inits ',' field_init { $$ = ext_node($1, 1, $3); }
1689 : ident { $$ = mk_node("FieldInit", 1, $1); }
1690 | ident ':' expr { $$ = mk_node("FieldInit", 2, $1, $3); }
1691 | LIT_INTEGER ':' expr { $$ = mk_node("FieldInit", 2, mk_atom(yytext), $3); }
1695 : DOTDOT expr { $$ = mk_node("DefaultFieldInit", 1, $2); }
1706 | UNSAFE block { $$ = mk_node("UnsafeBlock", 1, $2); }
1707 | path_expr '!' maybe_ident braces_delimited_token_trees { $$ = mk_node("Macro", 3, $1, $3, $4); }
1716 : block_expr '.' path_generic_args_with_colons %prec IDENT { $$ = mk_node("ExprField", 2, $1, $3); }
1717 | block_expr_dot '.' path_generic_args_with_colons %prec IDENT { $$ = mk_node("ExprField", 2, $1, $3); }
1718 | block_expr '.' path_generic_args_with_colons '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 3, $1, $3, $5); }
1719 | block_expr_dot '.' path_generic_args_with_colons '[' maybe_expr ']' { $$ = mk_node("ExprIndex", 3, $1, $3, $5); }
1720 | block_expr '.' path_generic_args_with_colons '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 3, $1, $3, $5); }
1721 | block_expr_dot '.' path_generic_args_with_colons '(' maybe_exprs ')' { $$ = mk_node("ExprCall", 3, $1, $3, $5); }
1722 | block_expr '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1723 | block_expr_dot '.' LIT_INTEGER { $$ = mk_node("ExprTupleIndex", 1, $1); }
1727 : MATCH expr_nostruct '{' '}' { $$ = mk_node("ExprMatch", 1, $2); }
1728 | MATCH expr_nostruct '{' match_clauses '}' { $$ = mk_node("ExprMatch", 2, $2, $4); }
1729 | MATCH expr_nostruct '{' match_clauses nonblock_match_clause '}' { $$ = mk_node("ExprMatch", 2, $2, ext_node($4, 1, $5)); }
1730 | MATCH expr_nostruct '{' nonblock_match_clause '}' { $$ = mk_node("ExprMatch", 2, $2, mk_node("Arms", 1, $4)); }
1734 : match_clause { $$ = mk_node("Arms", 1, $1); }
1735 | match_clauses match_clause { $$ = ext_node($1, 1, $2); }
1739 : nonblock_match_clause ','
1740 | block_match_clause
1741 | block_match_clause ','
1744 nonblock_match_clause
1745 : maybe_outer_attrs pats_or maybe_guard FAT_ARROW nonblock_expr { $$ = mk_node("ArmNonblock", 4, $1, $2, $3, $5); }
1746 | maybe_outer_attrs pats_or maybe_guard FAT_ARROW block_expr_dot { $$ = mk_node("ArmNonblock", 4, $1, $2, $3, $5); }
1750 : maybe_outer_attrs pats_or maybe_guard FAT_ARROW block { $$ = mk_node("ArmBlock", 4, $1, $2, $3, $5); }
1751 | maybe_outer_attrs pats_or maybe_guard FAT_ARROW block_expr { $$ = mk_node("ArmBlock", 4, $1, $2, $3, $5); }
1755 : IF expr_nostruct { $$ = $2; }
1756 | %empty { $$ = mk_none(); }
1760 : IF expr_nostruct block { $$ = mk_node("ExprIf", 2, $2, $3); }
1761 | IF expr_nostruct block ELSE block_or_if { $$ = mk_node("ExprIf", 3, $2, $3, $5); }
1765 : IF LET pat '=' expr_nostruct block { $$ = mk_node("ExprIfLet", 3, $3, $5, $6); }
1766 | IF LET pat '=' expr_nostruct block ELSE block_or_if { $$ = mk_node("ExprIfLet", 4, $3, $5, $6, $8); }
1776 : maybe_label WHILE expr_nostruct block { $$ = mk_node("ExprWhile", 3, $1, $3, $4); }
1780 : maybe_label WHILE LET pat '=' expr_nostruct block { $$ = mk_node("ExprWhileLet", 4, $1, $4, $6, $7); }
1784 : maybe_label LOOP block { $$ = mk_node("ExprLoop", 2, $1, $3); }
1788 : maybe_label FOR pat IN expr_nostruct block { $$ = mk_node("ExprForLoop", 4, $1, $3, $5, $6); }
1793 | %empty { $$ = mk_none(); }
1797 : LET pat maybe_ty_ascription maybe_init_expr ';' { $$ = mk_node("DeclLocal", 3, $2, $3, $4); }
1800 ////////////////////////////////////////////////////////////////////////
1801 // Part 5: Macros and misc. rules
1802 ////////////////////////////////////////////////////////////////////////
1805 : LIT_BYTE { $$ = mk_node("LitByte", 1, mk_atom(yytext)); }
1806 | LIT_CHAR { $$ = mk_node("LitChar", 1, mk_atom(yytext)); }
1807 | LIT_INTEGER { $$ = mk_node("LitInteger", 1, mk_atom(yytext)); }
1808 | LIT_FLOAT { $$ = mk_node("LitFloat", 1, mk_atom(yytext)); }
1809 | TRUE { $$ = mk_node("LitBool", 1, mk_atom(yytext)); }
1810 | FALSE { $$ = mk_node("LitBool", 1, mk_atom(yytext)); }
1815 : LIT_STR { $$ = mk_node("LitStr", 1, mk_atom(yytext), mk_atom("CookedStr")); }
1816 | LIT_STR_RAW { $$ = mk_node("LitStr", 1, mk_atom(yytext), mk_atom("RawStr")); }
1817 | LIT_BYTE_STR { $$ = mk_node("LitByteStr", 1, mk_atom(yytext), mk_atom("ByteStr")); }
1818 | LIT_BYTE_STR_RAW { $$ = mk_node("LitByteStr", 1, mk_atom(yytext), mk_atom("RawByteStr")); }
1822 : %empty { $$ = mk_none(); }
1827 : IDENT { $$ = mk_node("ident", 1, mk_atom(yytext)); }
1828 // Weak keywords that can be used as identifiers
1829 | CATCH { $$ = mk_node("ident", 1, mk_atom(yytext)); }
1830 | DEFAULT { $$ = mk_node("ident", 1, mk_atom(yytext)); }
1831 | UNION { $$ = mk_node("ident", 1, mk_atom(yytext)); }
1835 : SHL { $$ = mk_atom(yytext); }
1836 | SHR { $$ = mk_atom(yytext); }
1837 | LE { $$ = mk_atom(yytext); }
1838 | EQEQ { $$ = mk_atom(yytext); }
1839 | NE { $$ = mk_atom(yytext); }
1840 | GE { $$ = mk_atom(yytext); }
1841 | ANDAND { $$ = mk_atom(yytext); }
1842 | OROR { $$ = mk_atom(yytext); }
1843 | LARROW { $$ = mk_atom(yytext); }
1844 | SHLEQ { $$ = mk_atom(yytext); }
1845 | SHREQ { $$ = mk_atom(yytext); }
1846 | MINUSEQ { $$ = mk_atom(yytext); }
1847 | ANDEQ { $$ = mk_atom(yytext); }
1848 | OREQ { $$ = mk_atom(yytext); }
1849 | PLUSEQ { $$ = mk_atom(yytext); }
1850 | STAREQ { $$ = mk_atom(yytext); }
1851 | SLASHEQ { $$ = mk_atom(yytext); }
1852 | CARETEQ { $$ = mk_atom(yytext); }
1853 | PERCENTEQ { $$ = mk_atom(yytext); }
1854 | DOTDOT { $$ = mk_atom(yytext); }
1855 | DOTDOTDOT { $$ = mk_atom(yytext); }
1856 | MOD_SEP { $$ = mk_atom(yytext); }
1857 | RARROW { $$ = mk_atom(yytext); }
1858 | FAT_ARROW { $$ = mk_atom(yytext); }
1859 | LIT_BYTE { $$ = mk_atom(yytext); }
1860 | LIT_CHAR { $$ = mk_atom(yytext); }
1861 | LIT_INTEGER { $$ = mk_atom(yytext); }
1862 | LIT_FLOAT { $$ = mk_atom(yytext); }
1863 | LIT_STR { $$ = mk_atom(yytext); }
1864 | LIT_STR_RAW { $$ = mk_atom(yytext); }
1865 | LIT_BYTE_STR { $$ = mk_atom(yytext); }
1866 | LIT_BYTE_STR_RAW { $$ = mk_atom(yytext); }
1867 | IDENT { $$ = mk_atom(yytext); }
1868 | UNDERSCORE { $$ = mk_atom(yytext); }
1869 | LIFETIME { $$ = mk_atom(yytext); }
1870 | SELF { $$ = mk_atom(yytext); }
1871 | STATIC { $$ = mk_atom(yytext); }
1872 | ABSTRACT { $$ = mk_atom(yytext); }
1873 | ALIGNOF { $$ = mk_atom(yytext); }
1874 | AS { $$ = mk_atom(yytext); }
1875 | BECOME { $$ = mk_atom(yytext); }
1876 | BREAK { $$ = mk_atom(yytext); }
1877 | CATCH { $$ = mk_atom(yytext); }
1878 | CRATE { $$ = mk_atom(yytext); }
1879 | DEFAULT { $$ = mk_atom(yytext); }
1880 | DO { $$ = mk_atom(yytext); }
1881 | ELSE { $$ = mk_atom(yytext); }
1882 | ENUM { $$ = mk_atom(yytext); }
1883 | EXTERN { $$ = mk_atom(yytext); }
1884 | FALSE { $$ = mk_atom(yytext); }
1885 | FINAL { $$ = mk_atom(yytext); }
1886 | FN { $$ = mk_atom(yytext); }
1887 | FOR { $$ = mk_atom(yytext); }
1888 | IF { $$ = mk_atom(yytext); }
1889 | IMPL { $$ = mk_atom(yytext); }
1890 | IN { $$ = mk_atom(yytext); }
1891 | LET { $$ = mk_atom(yytext); }
1892 | LOOP { $$ = mk_atom(yytext); }
1893 | MACRO { $$ = mk_atom(yytext); }
1894 | MATCH { $$ = mk_atom(yytext); }
1895 | MOD { $$ = mk_atom(yytext); }
1896 | MOVE { $$ = mk_atom(yytext); }
1897 | MUT { $$ = mk_atom(yytext); }
1898 | OFFSETOF { $$ = mk_atom(yytext); }
1899 | OVERRIDE { $$ = mk_atom(yytext); }
1900 | PRIV { $$ = mk_atom(yytext); }
1901 | PUB { $$ = mk_atom(yytext); }
1902 | PURE { $$ = mk_atom(yytext); }
1903 | REF { $$ = mk_atom(yytext); }
1904 | RETURN { $$ = mk_atom(yytext); }
1905 | STRUCT { $$ = mk_atom(yytext); }
1906 | SIZEOF { $$ = mk_atom(yytext); }
1907 | SUPER { $$ = mk_atom(yytext); }
1908 | TRUE { $$ = mk_atom(yytext); }
1909 | TRAIT { $$ = mk_atom(yytext); }
1910 | TYPE { $$ = mk_atom(yytext); }
1911 | UNION { $$ = mk_atom(yytext); }
1912 | UNSAFE { $$ = mk_atom(yytext); }
1913 | UNSIZED { $$ = mk_atom(yytext); }
1914 | USE { $$ = mk_atom(yytext); }
1915 | VIRTUAL { $$ = mk_atom(yytext); }
1916 | WHILE { $$ = mk_atom(yytext); }
1917 | YIELD { $$ = mk_atom(yytext); }
1918 | CONTINUE { $$ = mk_atom(yytext); }
1919 | PROC { $$ = mk_atom(yytext); }
1920 | BOX { $$ = mk_atom(yytext); }
1921 | CONST { $$ = mk_atom(yytext); }
1922 | WHERE { $$ = mk_atom(yytext); }
1923 | TYPEOF { $$ = mk_atom(yytext); }
1924 | INNER_DOC_COMMENT { $$ = mk_atom(yytext); }
1925 | OUTER_DOC_COMMENT { $$ = mk_atom(yytext); }
1926 | SHEBANG { $$ = mk_atom(yytext); }
1927 | STATIC_LIFETIME { $$ = mk_atom(yytext); }
1928 | ';' { $$ = mk_atom(yytext); }
1929 | ',' { $$ = mk_atom(yytext); }
1930 | '.' { $$ = mk_atom(yytext); }
1931 | '@' { $$ = mk_atom(yytext); }
1932 | '#' { $$ = mk_atom(yytext); }
1933 | '~' { $$ = mk_atom(yytext); }
1934 | ':' { $$ = mk_atom(yytext); }
1935 | '$' { $$ = mk_atom(yytext); }
1936 | '=' { $$ = mk_atom(yytext); }
1937 | '?' { $$ = mk_atom(yytext); }
1938 | '!' { $$ = mk_atom(yytext); }
1939 | '<' { $$ = mk_atom(yytext); }
1940 | '>' { $$ = mk_atom(yytext); }
1941 | '-' { $$ = mk_atom(yytext); }
1942 | '&' { $$ = mk_atom(yytext); }
1943 | '|' { $$ = mk_atom(yytext); }
1944 | '+' { $$ = mk_atom(yytext); }
1945 | '*' { $$ = mk_atom(yytext); }
1946 | '/' { $$ = mk_atom(yytext); }
1947 | '^' { $$ = mk_atom(yytext); }
1948 | '%' { $$ = mk_atom(yytext); }
1952 : %empty { $$ = mk_node("TokenTrees", 0); }
1953 | token_trees token_tree { $$ = ext_node($1, 1, $2); }
1957 : delimited_token_trees
1958 | unpaired_token { $$ = mk_node("TTTok", 1, $1); }
1961 delimited_token_trees
1962 : parens_delimited_token_trees
1963 | braces_delimited_token_trees
1964 | brackets_delimited_token_trees
1967 parens_delimited_token_trees
1968 : '(' token_trees ')'
1970 $$ = mk_node("TTDelim", 3,
1971 mk_node("TTTok", 1, mk_atom("(")),
1973 mk_node("TTTok", 1, mk_atom(")")));
1977 braces_delimited_token_trees
1978 : '{' token_trees '}'
1980 $$ = mk_node("TTDelim", 3,
1981 mk_node("TTTok", 1, mk_atom("{")),
1983 mk_node("TTTok", 1, mk_atom("}")));
1987 brackets_delimited_token_trees
1988 : '[' token_trees ']'
1990 $$ = mk_node("TTDelim", 3,
1991 mk_node("TTTok", 1, mk_atom("[")),
1993 mk_node("TTTok", 1, mk_atom("]")));