Complete Grammar

<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>