<comment> ::= <line-comment>
| <block-comment>
<line-comment> ::= "//" <utf8-code-point>* "\n"
| "//" <utf8-code-point>* <EOF>
<block-comment> ::= "/*" <utf8-code-point>* "*/"
| "/*" <utf8-code-point>* <block-comment> <utf8-code-point>* "*/"
<identifier> ::= /[A-Za-z]_?([A-Za-z0-9]_?)*/
| /_([A-Za-z0-9]_?)+/
<path> ::= (<path-atom> "::")* <path-atom>
<path-atom> ::= <identifier>
| "project"
| "super"
| "self"
<block> ::= "{" <statement>* <expression>? "}"
<type> ::= <primitive-type>
<primitive-type> ::= "nothing"
| "bool"
| "u8"
| "u16"
| "u32"
| "u64"
| "usize"
| "i8"
| "i16"
| "i32"
| "i64"
| "isize"
<expression> ::= <literal-expression>
| <item-expression>
| <call-expression>
| <syscall-expression>
| <block-expression>
<literal-expression> ::= <boolean-literal>
| <integer-literal>
<boolean-literal> ::= "false"
| "true"
<integer-literal> ::= /0b_?([0-1]_?)*[0-1](_?((i|u)(8|16|32|64|size)))?/
| /0o_?([0-7]_?)*[0-7](_?((i|u)(8|16|32|64|size)))?/
| /([0-9]_?)*[0-9](_?((i|u)(8|16|32|64|size)))?/
| /0x_?([0-9A-Fa-f]_?)*[0-9A-Fa-f](_?((i|u)(8|16|32|64|size)))?/
<item-expression> ::= <path>
<call-expression> ::= <expression> "(" (<expression> ",")* <expression>? ")"
<syscall-expression> ::= @syscall "(" <expression> ("," <expression>)* ","? ")"
<block-expression> ::= <block>
<specification> ::= <assumes>? <requires>? <ensures>?
<assumes> ::= "assumes" <propositions>
<requires> ::= "requires" <propositions>
<ensures> ::= "ensures" <propositions>
<proposition> ::= <expression>
<propositions> ::= "{" (<proposition> ",")* <proposition>? "}"
<statement> ::= <import-statement>
| <export-statement>
| <function-definition-statement>
| <expression-statement>
| <block-statement>
<import-statement> ::= "import" (<import> | <imports>) ";"
<import> ::= <item-import> | <glob-import> | <nested-import>
<imports> ::= "{" (<import> ",")* <import>? "}"
<item-import> ::= <path> ("as" <identifier>)?
<glob-import> ::= <path> "::" "*"
<nested-import> ::= <path> "::" <imports>
<export-statement> ::= "export" (<export> | <exports>) ";"
<export> ::= <item-export> | <glob-export> | <nested-export>
<exports> ::= "{" (<export> ",")* <export>? "}"
<item-export> ::= <path> ("as" <identifier>)?
<glob-export> ::= <path> "::" "*"
<nested-export> ::= <path> "::" <exports>
<function-definition-statement> ::= "fn" <identifier> <function-signature> <specification> "=" <expression> ";"
<function-signature> ::= "(" (<identifier> ":" <type> ",")* (<identifier> ":" <type>)? ")" (: <type>)?
<expression-statement> ::= <expression> ";"
<block-statement> ::= <block>