INTRO
GRAMMAR
crate : maybe_shebang inner_attrs maybe_mod_items | maybe_shebang maybe_mod_items ;
maybe_shebang : SHEBANG_LINE | %empty ;
maybe_inner_attrs : inner_attrs | %empty ;
inner_attrs : inner_attr | inner_attrs inner_attr ;
inner_attr : SHEBANG '[' meta_item ']' | INNER_DOC_COMMENT ;
maybe_outer_attrs : outer_attrs | %empty ;
outer_attrs : outer_attr | outer_attrs outer_attr ;
outer_attr : '#' '[' meta_item ']' | OUTER_DOC_COMMENT ;
meta_item : ident | ident '=' lit | ident '(' meta_seq ')' | ident '(' meta_seq ',' ')' ;
meta_seq : %empty | meta_item | meta_seq ',' meta_item ;
maybe_mod_items : mod_items | %empty ;
mod_items : mod_item | mod_items mod_item ;
attrs_and_vis : maybe_outer_attrs visibility ;
mod_item : attrs_and_vis item ;
item : stmt_item | item_macro ;
stmt_item : item_static | item_const | item_type | block_item | view_item ;
item_static : STATIC ident ':' ty '=' expr ';' | STATIC MUT ident ':' ty '=' expr ';' ;
item_const : CONST ident ':' ty '=' expr ';' ;
item_macro : path_expr '!' maybe_ident parens_delimited_token_trees ';'
| path_expr '!' maybe_ident braces_delimited_token_trees
| path_expr '!' maybe_ident brackets_delimited_token_trees ';' ;
view_item : use_item | extern_fn_item | EXTERN CRATE ident ';'
| EXTERN CRATE ident AS ident ';' ;
extern_fn_item : EXTERN maybe_abi item_fn ;
use_item : USE view_path ';' ;
view_path : path_no_types_allowed
| path_no_types_allowed MOD_SEP '{' '}'
| MOD_SEP '{' '}'
| path_no_types_allowed MOD_SEP '{' idents_or_self '}'
| MOD_SEP '{' idents_or_self '}'
| path_no_types_allowed MOD_SEP '{' idents_or_self ',' '}'
| MOD_SEP '{' idents_or_self ',' '}'
| path_no_types_allowed MOD_SEP '*'
| MOD_SEP '*'
| '*'
| '{' '}'
| '{' idents_or_self '}'
| '{' idents_or_self ',' '}'
| path_no_types_allowed AS ident ;
block_item : item_fn | item_unsafe_fn | item_mod | item_foreign_mod
| item_struct | item_enum | item_union | item_trait | item_impl ;
maybe_ty_ascription : ':' ty_sum | %empty ;
maybe_init_expr : '=' expr | %empty ;
item_struct : STRUCT ident generic_params maybe_where_clause struct_decl_args
| STRUCT ident generic_params struct_tuple_args maybe_where_clause ';'
| STRUCT ident generic_params maybe_where_clause ';' ;
struct_decl_args : '{' struct_decl_fields '}' | '{' struct_decl_fields ',' '}' ;
struct_tuple_args : '(' struct_tuple_fields ')' | '(' struct_tuple_fields ',' ')' ;
struct_decl_fields : struct_decl_field | struct_decl_fields ',' struct_decl_field | %empty ;
struct_decl_field : attrs_and_vis ident ':' ty_sum ;
struct_tuple_fields : struct_tuple_field | struct_tuple_fields ',' struct_tuple_field | %empty ;
struct_tuple_field : attrs_and_vis ty_sum ;
item_enum : ENUM ident generic_params maybe_where_clause '{' enum_defs '}'
| ENUM ident generic_params maybe_where_clause '{' enum_defs ',' '}' ;
enum_defs : enum_def | enum_defs ',' enum_def | %empty ;
enum_def : attrs_and_vis ident enum_args ;
enum_args : '{' struct_decl_fields '}' | '{' struct_decl_fields ',' '}'
| '(' maybe_ty_sums ')' | '=' expr | %empty ;
tem_union : UNION ident generic_params maybe_where_clause '{' struct_decl_fields '}'
| UNION ident generic_params maybe_where_clause '{' struct_decl_fields ',' '}'
item_mod : MOD ident ';' | MOD ident '{' maybe_mod_items '}' | MOD ident '{' inner_attrs maybe_mod_items '}' ;
item_foreign_mod : EXTERN maybe_abi '{' maybe_foreign_items '}'
| EXTERN maybe_abi '{' inner_attrs maybe_foreign_items '}' ;
maybe_abi : str | %empty ;
maybe_foreign_items : foreign_items | %empty ;
foreign_items : foreign_item | foreign_items foreign_item ;
foreign_item : attrs_and_vis STATIC item_foreign_static
| attrs_and_vis item_foreign_fn | attrs_and_vis UNSAFE item_foreign_fn ;
item_foreign_static : maybe_mut ident ':' ty ';' ;
item_foreign_fn : FN ident generic_params fn_decl_allow_variadic maybe_where_clause ';' ;
fn_decl_allow_variadic : fn_params_allow_variadic ret_ty ;
fn_params_allow_variadic : '(' ')' | '(' params ')' | '(' params ',' ')' | '(' params ',' DOTDOTDOT ')' ;
visibility : PUB | %empty ;
idents_or_self : ident_or_self | idents_or_self AS ident | idents_or_self ',' ident_or_self ;
ident_or_self : ident | SELF ;
item_type : TYPE ident generic_params maybe_where_clause '=' ty_sum ';' ;
for_sized : FOR '?' ident | FOR ident '?' | %empty ;
item_trait : maybe_unsafe TRAIT ident generic_params
for_sized maybe_ty_param_bounds maybe_where_clause '{' maybe_trait_items '}' ;
maybe_trait_items : trait_items | %empty ;
trait_items : trait_item | trait_items trait_item ;
trait_item : trait_const | trait_type | trait_method | maybe_outer_attrs item_macro ;
trait_const : maybe_outer_attrs CONST ident maybe_ty_ascription maybe_const_default ';' ;
maybe_const_default : '=' expr | %empty ;
trait_type : maybe_outer_attrs TYPE ty_param ';' ;
maybe_unsafe : UNSAFE | %empty ;
maybe_default_maybe_unsafe : DEFAULT UNSAFE | DEFAULT |UNSAFE | %empty ;
trait_method
: type_method { $$ = mk_node("Required", 1, $1); }
| method { $$ = mk_node("Provided", 1, $1); }
;
type_method
: maybe_outer_attrs maybe_unsafe FN ident generic_params
fn_decl_with_self_allow_anon_params maybe_where_clause ';'
| maybe_outer_attrs CONST maybe_unsafe FN ident generic_params
fn_decl_with_self_allow_anon_params maybe_where_clause ';'
| maybe_outer_attrs maybe_unsafe EXTERN maybe_abi FN ident generic_params
fn_decl_with_self_allow_anon_params maybe_where_clause ';' ;
method
: maybe_outer_attrs maybe_unsafe FN ident generic_params
fn_decl_with_self_allow_anon_params maybe_where_clause inner_attrs_and_block
| maybe_outer_attrs CONST maybe_unsafe FN ident generic_params
fn_decl_with_self_allow_anon_params maybe_where_clause inner_attrs_and_block
| 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 ;
impl_method
: attrs_and_vis maybe_default maybe_unsafe FN ident generic_params
fn_decl_with_self maybe_where_clause inner_attrs_and_block
| attrs_and_vis maybe_default CONST maybe_unsafe FN ident generic_params
fn_decl_with_self maybe_where_clause inner_attrs_and_block
| 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 ;
item_impl
: maybe_default_maybe_unsafe IMPL generic_params
ty_prim_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
| maybe_default_maybe_unsafe IMPL generic_params
'(' ty ')' maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
| maybe_default_maybe_unsafe IMPL generic_params
trait_ref FOR ty_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
| maybe_default_maybe_unsafe IMPL generic_params
'!' trait_ref FOR ty_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
| maybe_default_maybe_unsafe IMPL generic_params trait_ref FOR DOTDOT '{' '}'
| maybe_default_maybe_unsafe IMPL generic_params '!' trait_ref FOR DOTDOT '{' '}' ;
maybe_impl_items : impl_items | %empty ;
impl_items : impl_item | impl_item impl_items ;
impl_item : impl_method | attrs_and_vis item_macro | impl_const | impl_type ;
maybe_default : DEFAULT | %empty ;
impl_const : attrs_and_vis maybe_default item_const ;
impl_type : attrs_and_vis maybe_default TYPE ident generic_params '=' ty_sum ';' ;
item_fn : FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block
| CONST FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block ;
item_unsafe_fn
: UNSAFE FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block
| CONST UNSAFE FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block
| UNSAFE EXTERN maybe_abi FN ident generic_params fn_decl maybe_where_clause inner_attrs_and_block ;
fn_decl : fn_params ret_ty ;
fn_decl_with_self : fn_params_with_self ret_ty ;
fn_decl_with_self_allow_anon_params : fn_anon_params_with_self ret_ty ;
fn_params : '(' maybe_params ')' ;
fn_anon_params : '(' anon_param anon_params_allow_variadic_tail ')' | '(' ')' ;
fn_params_with_self
: '(' maybe_mut SELF maybe_ty_ascription maybe_comma_params ')'
| '(' '&' maybe_mut SELF maybe_ty_ascription maybe_comma_params ')'
| '(' '&' lifetime maybe_mut SELF maybe_ty_ascription maybe_comma_params ')'
| '(' maybe_params ')' ;
fn_anon_params_with_self
: '(' maybe_mut SELF maybe_ty_ascription maybe_comma_anon_params ')'
| '(' '&' maybe_mut SELF maybe_ty_ascription maybe_comma_anon_params ')'
| '(' '&' lifetime maybe_mut SELF maybe_ty_ascription maybe_comma_anon_params ')'
| '(' maybe_anon_params ')' ;
maybe_params : params | params ',' | %empty ;
params : param | params ',' param ;
param : pat ':' ty_sum ;
inferrable_params : inferrable_param | inferrable_params ',' inferrable_param ;
inferrable_param : pat maybe_ty_ascription ;
maybe_comma_params : ',' | ',' params | ',' params ',' | %empty ;
maybe_comma_anon_params : ',' | ',' anon_params | ',' anon_params ',' | %empty ;
maybe_anon_params : anon_params | anon_params ',' | %empty ;
anon_params : anon_param | anon_params ',' anon_param ;
anon_param : named_arg ':' ty | ty ;
anon_params_allow_variadic_tail : ',' DOTDOTDOT | ',' anon_param anon_params_allow_variadic_tail | %empty ;
named_arg : ident | UNDERSCORE | '&' ident | '&' UNDERSCORE | ANDAND ident | ANDAND UNDERSCORE | MUT ident ;
ret_ty : RARROW '!'
| RARROW ty
| %prec IDENT %empty
;
generic_params : '<' '>' | '<' lifetimes '>'
| '<' lifetimes ',' '>' | '<' lifetimes SHR | '<' lifetimes ',' SHR | '<' lifetimes ',' ty_params '>'
| '<' lifetimes ',' ty_params ',' '>' | '<' lifetimes ',' ty_params SHR | '<' lifetimes ',' ty_params ',' SHR
| '<' ty_params '>' | '<' ty_params ',' '>' | '<' ty_params SHR | '<' ty_params ',' SHR | %empty ;
maybe_where_clause : %empty | where_clause ;
where_clause : WHERE where_predicates | WHERE where_predicates ',' ;
where_predicates : where_predicate | where_predicates ',' where_predicate ;
where_predicate : maybe_for_lifetimes lifetime ':' bounds | maybe_for_lifetimes ty ':' ty_param_bounds ;
maybe_for_lifetimes : FOR '<' lifetimes '>' | %prec FORTYPE %empty ;
ty_params : ty_param | ty_params ',' ty_param ;
path_no_types_allowed : ident | MOD_SEP ident | SELF | MOD_SEP SELF | SUPER
| MOD_SEP SUPER | path_no_types_allowed MOD_SEP ident ;
path_generic_args_without_colons : %prec IDENT ident
| %prec IDENT ident generic_args | %prec IDENT ident '(' maybe_ty_sums ')' ret_ty
| %prec IDENT path_generic_args_without_colons MOD_SEP ident
| %prec IDENT path_generic_args_without_colons MOD_SEP ident generic_args
| %prec IDENT path_generic_args_without_colons MOD_SEP ident '(' maybe_ty_sums ')' ret_ty ;
generic_args : '<' generic_values '>' | '<' generic_values SHR | '<' generic_values GE
| '<' generic_values SHREQ | SHL ty_qualified_path_and_generic_values '>'
| SHL ty_qualified_path_and_generic_values SHR
| SHL ty_qualified_path_and_generic_values GE
| SHL ty_qualified_path_and_generic_values SHREQ ;
generic_values : maybe_ty_sums_and_or_bindings ;
maybe_ty_sums_and_or_bindings
: ty_sums | ty_sums ',' | ty_sums ',' bindings | bindings | bindings ',' | %empty ;
maybe_bindings : ',' bindings | %empty ;
pat : UNDERSCORE | '&' pat | '&' MUT pat | ANDAND pat | '(' ')' | '(' pat_tup ')'
| '[' pat_vec ']' | lit_or_path | lit_or_path DOTDOTDOT lit_or_path | path_expr '{' pat_struct '}'
| path_expr '(' ')' | path_expr '(' pat_tup ')' | path_expr '!' maybe_ident delimited_token_trees
| binding_mode ident | ident '@' pat | binding_mode ident '@' pat | BOX pat
| '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident
| SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_as_trait_ref '>' MOD_SEP ident ;
pats_or : pat | pats_or '|' pat ;
binding_mode : REF | REF MUT | MUT ;
lit_or_path : path_expr | lit | '-' lit ;
pat_field : ident | binding_mode ident | BOX ident | BOX binding_mode ident
| ident ':' pat | binding_mode ident ':' pat | LIT_INTEGER ':' pat ;
pat_fields : pat_field | pat_fields ',' pat_field ;
pat_struct : pat_fields | pat_fields ',' | pat_fields ',' DOTDOT | DOTDOT | %empty ;
pat_tup : pat_tup_elts | pat_tup_elts ',' | pat_tup_elts DOTDOT | pat_tup_elts ',' DOTDOT
| pat_tup_elts DOTDOT ',' pat_tup_elts | pat_tup_elts DOTDOT ',' pat_tup_elts ','
| pat_tup_elts ',' DOTDOT ',' pat_tup_elts | pat_tup_elts ',' DOTDOT ',' pat_tup_elts ','
| DOTDOT ',' pat_tup_elts | DOTDOT ',' pat_tup_elts ','
| DOTDOT ;
pat_tup_elts : pat | pat_tup_elts ',' pat ;
pat_vec : pat_vec_elts | pat_vec_elts ',' | pat_vec_elts DOTDOT
| pat_vec_elts ',' DOTDOT | pat_vec_elts DOTDOT ',' pat_vec_elts
| pat_vec_elts DOTDOT ',' pat_vec_elts ','
| pat_vec_elts ',' DOTDOT ',' pat_vec_elts
| pat_vec_elts ',' DOTDOT ',' pat_vec_elts ','
| DOTDOT ',' pat_vec_elts | DOTDOT ',' pat_vec_elts ','
| DOTDOT | %empty ;
pat_vec_elts : pat | pat_vec_elts ',' pat ;
ty : ty_prim | ty_closure | '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident
| SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_as_trait_ref '>' MOD_SEP ident
| '(' ty_sums ')' | '(' ty_sums ',' ')' | '(' ')' ;
ty_prim
: %prec IDENT path_generic_args_without_colons
| %prec IDENT MOD_SEP path_generic_args_without_colons
| %prec IDENT SELF MOD_SEP path_generic_args_without_colons
| %prec IDENT path_generic_args_without_colons '!' maybe_ident delimited_token_trees
| %prec IDENT MOD_SEP path_generic_args_without_colons '!' maybe_ident delimited_token_trees
| BOX ty
| '*' maybe_mut_or_const ty
| '&' ty
| '&' MUT ty
| ANDAND ty
| ANDAND MUT ty
| '&' lifetime maybe_mut ty
| ANDAND lifetime maybe_mut ty
| '[' ty ']'
| '[' ty ',' DOTDOT expr ']'
| '[' ty ';' expr ']'
| TYPEOF '(' expr ')'
| UNDERSCORE
| ty_bare_fn
| for_in_type
;
ty_bare_fn : FN ty_fn_decl | UNSAFE FN ty_fn_decl
| EXTERN maybe_abi FN ty_fn_decl | UNSAFE EXTERN maybe_abi FN ty_fn_decl ;
ty_fn_decl : generic_params fn_anon_params ret_ty ;
ty_closure : UNSAFE '|' anon_params '|' maybe_bounds ret_ty
| '|' anon_params '|' maybe_bounds ret_ty
| UNSAFE OROR maybe_bounds ret_ty | OROR maybe_bounds ret_ty ;
for_in_type : FOR '<' maybe_lifetimes '>' for_in_type_suffix ;
for_in_type_suffix : ty_bare_fn | trait_ref | ty_closure ;
maybe_mut : MUT | %prec MUT %empty ;
maybe_mut_or_const : MUT | CONST | %empty ;
ty_qualified_path_and_generic_values : ty_qualified_path maybe_bindings | ty_qualified_path ',' ty_sums maybe_bindings ;
ty_qualified_path : ty_sum AS trait_ref '>' MOD_SEP ident | ty_sum AS trait_ref '>' MOD_SEP ident '+' ty_param_bounds ;
maybe_ty_sums : ty_sums | ty_sums ',' | %empty ;
ty_sums : ty_sum | ty_sums ',' ty_sum ;
ty_sum : ty_sum_elt | ty_sum '+' ty_sum_elt ;
ty_sum_elt : ty | lifetime ;
ty_prim_sum : ty_prim_sum_elt | ty_prim_sum '+' ty_prim_sum_elt ;
ty_prim_sum_elt : ty_prim | lifetime ;
maybe_ty_param_bounds : ':' ty_param_bounds | %empty ;
ty_param_bounds : boundseq | %empty ;
boundseq : polybound | boundseq '+' polybound ;
polybound : FOR '<' maybe_lifetimes '>' bound | bound
| '?' FOR '<' maybe_lifetimes '>' bound
| '?' bound ;
bindings : binding | bindings ',' binding ;
binding : ident '=' ty ;
ty_param : ident maybe_ty_param_bounds maybe_ty_default
| ident '?' ident maybe_ty_param_bounds maybe_ty_default ;
maybe_bounds : %prec SHIFTPLUS ':' bounds | %prec SHIFTPLUS %empty ;
bounds : bound | bounds '+' bound ;
bound : lifetime | trait_ref ;
maybe_ltbounds : %prec SHIFTPLUS ':' ltbounds | %empty ;
ltbounds : lifetime | ltbounds '+' lifetime ;
maybe_ty_default : '=' ty_sum | %empty ;
maybe_lifetimes : lifetimes | lifetimes ',' | %empty ;
lifetimes : lifetime_and_bounds | lifetimes ',' lifetime_and_bounds ;
lifetime_and_bounds : LIFETIME maybe_ltbounds | STATIC_LIFETIME ;
lifetime : LIFETIME | STATIC_LIFETIME ;
trait_ref : %prec IDENT path_generic_args_without_colons | %prec IDENT MOD_SEP path_generic_args_without_colons ;
inner_attrs_and_block : '{' maybe_inner_attrs maybe_stmts '}' ;
block : '{' maybe_stmts '}' ;
maybe_stmts : stmts | stmts nonblock_expr | nonblock_expr | %empty ;
stmts : stmt | stmts stmt ;
stmt : maybe_outer_attrs let | stmt_item
| PUB stmt_item | outer_attrs stmt_item | outer_attrs PUB stmt_item | full_block_expr
| maybe_outer_attrs block | nonblock_expr ';' | outer_attrs nonblock_expr ';' | ';' ;
maybe_exprs : exprs | exprs ',' | %empty ;
maybe_expr : expr | %empty ;
exprs : expr | exprs ',' expr ;
path_expr : path_generic_args_with_colons
| MOD_SEP path_generic_args_with_colons | SELF MOD_SEP path_generic_args_with_colons ;
path_generic_args_with_colons : ident | SUPER | path_generic_args_with_colons MOD_SEP ident
| path_generic_args_with_colons MOD_SEP SUPER | path_generic_args_with_colons MOD_SEP generic_args ;
macro_expr : path_expr '!' maybe_ident parens_delimited_token_trees
| path_expr '!' maybe_ident brackets_delimited_token_trees ;
nonblock_expr : lit | %prec IDENT path_expr | SELF | macro_expr | path_expr '{' struct_expr_fields '}'
| nonblock_expr '?' | nonblock_expr '.' path_generic_args_with_colons | nonblock_expr '.' LIT_INTEGER
| nonblock_expr '[' maybe_expr ']' | nonblock_expr '(' maybe_exprs ')' | '[' vec_expr ']' | '(' maybe_exprs ')'
| CONTINUE | CONTINUE lifetime | RETURN | RETURN expr
| BREAK | BREAK lifetime | YIELD | YIELD expr | nonblock_expr '=' expr
| nonblock_expr SHLEQ expr | nonblock_expr SHREQ expr | nonblock_expr MINUSEQ expr | nonblock_expr ANDEQ expr
| nonblock_expr OREQ expr | nonblock_expr PLUSEQ expr | nonblock_expr STAREQ expr | nonblock_expr SLASHEQ expr
| nonblock_expr CARETEQ expr | nonblock_expr PERCENTEQ expr | nonblock_expr OROR expr | nonblock_expr ANDAND expr
| nonblock_expr EQEQ expr | nonblock_expr NE expr | nonblock_expr '<' expr | nonblock_expr '>' expr
| nonblock_expr LE expr | nonblock_expr GE expr | nonblock_expr '|' expr | nonblock_expr '^' expr
| nonblock_expr '&' expr | nonblock_expr SHL expr | nonblock_expr SHR expr | nonblock_expr '+' expr
| nonblock_expr '-' expr | nonblock_expr '*' expr | nonblock_expr '/' expr | nonblock_expr '%' expr
| nonblock_expr DOTDOT | nonblock_expr DOTDOT expr | DOTDOT expr | DOTDOT | nonblock_expr AS ty
| nonblock_expr ':' ty | BOX expr | expr_qualified_path | nonblock_prefix_expr ;
expr : lit | %prec IDENT path_expr | SELF | macro_expr | path_expr '{' struct_expr_fields '}'
| expr '?' | expr '.' path_generic_args_with_colons | expr '.' LIT_INTEGER
| expr '[' maybe_expr ']' | expr '(' maybe_exprs ')' | '(' maybe_exprs ')' | '[' vec_expr ']'
| CONTINUE | CONTINUE ident | RETURN | RETURN expr | BREAK | BREAK ident
| YIELD | YIELD expr | expr '=' expr | expr SHLEQ expr | expr SHREQ expr | expr MINUSEQ expr
| expr ANDEQ expr | expr OREQ expr | expr PLUSEQ expr | expr STAREQ expr | expr SLASHEQ expr
| expr CARETEQ expr | expr PERCENTEQ expr | expr OROR expr | expr ANDAND expr | expr EQEQ expr | expr NE expr
| expr '<' expr | expr '>' expr | expr LE expr | expr GE expr | expr '|' expr | expr '^' expr | expr '&' expr
| expr SHL expr | expr SHR expr | expr '+' expr | expr '-' expr | expr '*' expr | expr '/' expr | expr '%' expr
| expr DOTDOT | expr DOTDOT expr | DOTDOT expr | DOTDOT
| expr AS ty | expr ':' ty | BOX expr | expr_qualified_path | block_expr | block | nonblock_prefix_expr ;
expr_nostruct : lit | %prec IDENT path_expr | SELF | macro_expr | expr_nostruct '?'
| expr_nostruct '.' path_generic_args_with_colons | expr_nostruct '.' LIT_INTEGER | expr_nostruct '[' maybe_expr ']'
| expr_nostruct '(' maybe_exprs ')' | '[' vec_expr ']' | '(' maybe_exprs ')' | CONTINUE | CONTINUE ident | RETURN
| RETURN expr | BREAK | BREAK ident | YIELD | YIELD expr | expr_nostruct '=' expr_nostruct
| expr_nostruct SHLEQ expr_nostruct | expr_nostruct SHREQ expr_nostruct | expr_nostruct MINUSEQ expr_nostruct
| expr_nostruct ANDEQ expr_nostruct | expr_nostruct OREQ expr_nostruct | expr_nostruct PLUSEQ expr_nostruct
| expr_nostruct STAREQ expr_nostruct | expr_nostruct SLASHEQ expr_nostruct | expr_nostruct CARETEQ expr_nostruct
| expr_nostruct PERCENTEQ expr_nostruct | expr_nostruct OROR expr_nostruct | expr_nostruct ANDAND expr_nostruct
| expr_nostruct EQEQ expr_nostruct | expr_nostruct NE expr_nostruct | expr_nostruct '<' expr_nostruct
| expr_nostruct '>' expr_nostruct | expr_nostruct LE expr_nostruct | expr_nostruct GE expr_nostruct
| expr_nostruct '|' expr_nostruct | expr_nostruct '^' expr_nostruct | expr_nostruct '&' expr_nostruct
| expr_nostruct SHL expr_nostruct | expr_nostruct SHR expr_nostruct | expr_nostruct '+' expr_nostruct
| expr_nostruct '-' expr_nostruct | expr_nostruct '*' expr_nostruct | expr_nostruct '/' expr_nostruct
| expr_nostruct '%' expr_nostruct | expr_nostruct DOTDOT %prec RANGE | expr_nostruct DOTDOT expr_nostruct
| DOTDOT expr_nostruct | DOTDOT | expr_nostruct AS ty | expr_nostruct ':' ty
| BOX expr | expr_qualified_path | block_expr | block | nonblock_prefix_expr_nostruct ;
nonblock_prefix_expr_nostruct : '-' expr_nostruct | '!' expr_nostruct | '*' expr_nostruct
| '&' maybe_mut expr_nostruct | ANDAND maybe_mut expr_nostruct
| lambda_expr_nostruct | MOVE lambda_expr_nostruct ;
nonblock_prefix_expr : '-' expr | '!' expr | '*' expr | '&' maybe_mut expr | ANDAND maybe_mut expr
| lambda_expr | MOVE lambda_expr ;
expr_qualified_path
: '<' ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_qpath_params
| SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_as_trait_ref '>' MOD_SEP ident
| SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident generic_args maybe_as_trait_ref '>' MOD_SEP ident
| SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident maybe_as_trait_ref '>' MOD_SEP ident generic_args
| SHL ty_sum maybe_as_trait_ref '>' MOD_SEP ident generic_args maybe_as_trait_ref '>' MOD_SEP ident generic_args
maybe_qpath_params
: MOD_SEP generic_args { $$ = $2; }
| %empty { $$ = mk_none(); }
;
maybe_as_trait_ref
: AS trait_ref { $$ = $2; }
| %empty { $$ = mk_none(); }
;
lambda_expr : %prec LAMBDA OROR ret_ty expr | %prec LAMBDA '|' '|' ret_ty expr
| %prec LAMBDA '|' inferrable_params '|' ret_ty expr
| %prec LAMBDA '|' inferrable_params OROR lambda_expr_no_first_bar ;
lambda_expr_no_first_bar : %prec LAMBDA '|' ret_ty expr | %prec LAMBDA inferrable_params
'|' ret_ty expr | %prec LAMBDA inferrable_params OROR lambda_expr_no_first_bar ;
lambda_expr_nostruct : %prec LAMBDA OROR expr_nostruct | %prec LAMBDA '|' '|' ret_ty expr_nostruct
| %prec LAMBDA '|' inferrable_params '|' expr_nostruct
| %prec LAMBDA '|' inferrable_params OROR lambda_expr_nostruct_no_first_bar ;
lambda_expr_nostruct_no_first_bar : %prec LAMBDA '|' ret_ty expr_nostruct
| %prec LAMBDA inferrable_params '|' ret_ty expr_nostruct
| %prec LAMBDA inferrable_params OROR lambda_expr_nostruct_no_first_bar ;
vec_expr : maybe_exprs | exprs ';' expr ;
struct_expr_fields : field_inits | field_inits ',' | maybe_field_inits default_field_init | %empty ;
maybe_field_inits : field_inits | field_inits ',' | %empty ;
field_inits : field_init | field_inits ',' field_init ;
field_init : ident | ident ':' expr | LIT_INTEGER ':' expr ;
default_field_init : DOTDOT expr ;
block_expr : expr_match | expr_if | expr_if_let | expr_while | expr_while_let | expr_loop
| expr_for | UNSAFE block | path_expr '!' maybe_ident braces_delimited_token_trees ;
full_block_expr : block_expr | block_expr_dot ;
block_expr_dot : block_expr '.' path_generic_args_with_colons %prec IDENT
| block_expr_dot '.' path_generic_args_with_colons %prec IDENT
| block_expr '.' path_generic_args_with_colons '[' maybe_expr ']'
| block_expr_dot '.' path_generic_args_with_colons '[' maybe_expr ']'
| block_expr '.' path_generic_args_with_colons '(' maybe_exprs ')'
| block_expr_dot '.' path_generic_args_with_colons '(' maybe_exprs ')'
| block_expr '.' LIT_INTEGER
| block_expr_dot '.' LIT_INTEGER ;
expr_match : MATCH expr_nostruct '{' '}'
| MATCH expr_nostruct '{' match_clauses '}'
| MATCH expr_nostruct '{' match_clauses nonblock_match_clause '}'
| MATCH expr_nostruct '{' nonblock_match_clause '}' ;
match_clauses : match_clause | match_clauses match_clause ;
match_clause : nonblock_match_clause ',' | block_match_clause | block_match_clause ',' ;
nonblock_match_clause : maybe_outer_attrs pats_or maybe_guard FAT_ARROW nonblock_expr
| maybe_outer_attrs pats_or maybe_guard FAT_ARROW block_expr_dot ;
block_match_clause : maybe_outer_attrs pats_or maybe_guard FAT_ARROW block
| maybe_outer_attrs pats_or maybe_guard FAT_ARROW block_expr ;
maybe_guard : IF expr_nostruct | %empty ;
expr_if : IF expr_nostruct block | IF expr_nostruct block ELSE block_or_if ;
expr_if_let : IF LET pat '=' expr_nostruct block | IF LET pat '=' expr_nostruct block ELSE block_or_if ;
block_or_if : block | expr_if | expr_if_let ;
expr_while : maybe_label WHILE expr_nostruct block ;
expr_while_let : maybe_label WHILE LET pat '=' expr_nostruct block ;
expr_loop : maybe_label LOOP block ;
expr_for : maybe_label FOR pat IN expr_nostruct block ;
maybe_label : lifetime ':' | %empty ;
let : LET pat maybe_ty_ascription maybe_init_expr ';' ;
lit : LIT_BYTE | LIT_CHAR | LIT_INTEGER | LIT_FLOAT | TRUE | FALSE | str ;
str : LIT_STR | LIT_STR_RAW | LIT_BYTE_STR | LIT_BYTE_STR_RAW ;
maybe_ident : %empty | ident ;
ident : IDENT | CATCH | DEFAULT | UNION ;
unpaired_token : SHL | SHR | LE | EQEQ | NE | GE | ANDAND | OROR | LARROW | SHLEQ | SHREQ
| MINUSEQ | ANDEQ | OREQ | PLUSEQ | STAREQ | SLASHEQ | CARETEQ | PERCENTEQ | DOTDOT
| DOTDOTDOT | MOD_SEP | RARROW | FAT_ARROW | LIT_BYTE | LIT_CHAR | LIT_INTEGER
| LIT_FLOAT | LIT_STR | LIT_STR_RAW | LIT_BYTE_STR | LIT_BYTE_STR_RAW
| IDENT | UNDERSCORE | LIFETIME | SELF | STATIC | ABSTRACT | ALIGNF
| AS | BECOME | BREAK | CATCH | CRATE | DEFAULT | DO | ELSE | ENUM
| EXTERN | FALSE | FINAL | FN | FOR | IF | IMPL | IN | LET | LOOP | MACRO
| MATCH | MOD | MOVE | MUT | OFFSETOF | OVERRIDE | PRIV | PUB
| PURE | REF | RETURN | STRUCT | SIZEOF | SUPER | TRUE | TRAIT | TYPE
| UNION | UNSAFE | UNSIZED | USE | VIRTUAL | WHILE | YIELD | CONTINUE
| PROC | BOX | CONST | WHERE | TYPEOF | INNER_DOC_COMMENT | OUTER_DOC_COMMENT
| SHEBANG | STATIC_LIFETIME | ';' | ',' | '.' | '@' | '#' | '~' | ':' | '$' | '=' | '?'
| '!' | '<' | '>' | '-' | '&' | '|' | '+' | '*' | '/' | '^' | '%' ;
token_trees : %empty | token_trees token_tree ;
token_tree : delimited_token_trees | unpaired_token ;
delimited_token_trees : parens_delimited_token_trees | braces_delimited_token_trees | brackets_delimited_token_trees ;
parens_delimited_token_trees : '(' token_trees ')' ;
braces_delimited_token_trees : '{' token_trees '}' ;
brackets_delimited_token_trees : '[' token_trees ']' ;