Declarations
Top level:
toplevel ::=
space_decl | pull_decl | share_decl | use_decl
| const_decl | type_decl | macro_decl
| form_decl | pick_decl | proc_decl | entry_decl
| comment
;
Key forms:
space_decl ::= "space" WS1 module_path ;
pull_decl ::= "pull" WS1 module_path [ WS1 "as" WS1 ident ] ;
use_decl ::= "use" WS1 module_path [ use_group | use_glob ] [ WS1 "as" WS1 ident ] ;
use_glob ::= "." "*" ;
use_group ::= "." "{" WS? ident_list WS? "}" ;
share_decl ::= "share" WS1 ( "all" | ident_list ) ;
const_decl ::= "const" WS1 ident [ ":" WS? type_expr ] WS? "=" WS? expr ;
type_decl ::= "type" WS1 ident [ type_params ] WS? "=" WS? type_expr ;
macro_decl ::= "macro" WS1 ident "(" param_list? ")" WS? block ;
form_decl ::= ("form" | "trait") WS1 ident [ type_params ] WS? { field_decl WS? } ".end" ;
pick_decl ::= "pick" WS1 ident [ type_params ] WS? { case_decl WS? } ".end" ;
proc_decl ::= { attribute WS? }
"proc" WS1 ident [ type_params ]
"(" WS? param_list? WS? ")"
[ WS? "->" WS? type_expr ]
[ WS? block ] ;
entry_decl ::= "entry" WS1 ident WS1 "at" WS1 module_path WS? block ;
attribute ::= "#[" ident [ "(" attr_args? ")" ] "]" ;
attr_args ::= attr_arg { WS? "," WS? attr_arg } ;
attr_arg ::= ident | string_lit | int_lit ;