Rule SourceUnit
rule SourceUnit ::=
SourceUnitPart *
;
Rule SourceUnitPart
rule SourceUnitPart ::=
ContractDefinition
| ImportDirective
;
Rule ImportDirective
rule ImportDirective ::=
'import' StringLiteral ';'
| 'import' StringLiteral 'as' Identifier ';'
;
Rule Type
rule Type ::=
'bool'
| 'u32'
| 'u64'
| 'u256'
| 'address'
| 'field'
| 'hash'
| 'fields'
| 'string'
| 'mapping' '(' Precedence0 Identifier ? '=>' Precedence0 Identifier ? ')'
;
Rule StorageLocation
rule StorageLocation ::=
'memory'
| 'storage'
;
Rule IdentifierOrError
rule IdentifierOrError ::=
Identifier
|
;
Rule VariableDeclaration
rule VariableDeclaration ::=
Precedence0 StorageLocation ? IdentifierOrError
;
Rule StructDefinition
rule StructDefinition ::=
'struct' IdentifierOrError '{' ( VariableDeclaration ';' ) * '}'
;
Rule ContractPart
rule ContractPart ::=
StructDefinition
| EnumDefinition
| VariableDefinition
| FunctionDefinition
| TypeDefinition
| ';'
;
Rule ContractDefinition
rule ContractDefinition ::=
'contract' IdentifierOrError '{' ( ContractPart ) * '}'
;
Rule EnumDefinition
rule EnumDefinition ::=
'enum' IdentifierOrError '{' Comma!(IdentifierOrError) '}'
;
Rule VariableDefinition
rule VariableDefinition ::=
Precedence0 VariableAttribute * IdentifierOrError ( '=' Expression ) ? ';'
| Precedence0 VariableAttribute * Identifier ';'
;
Rule TypeDefinition
rule TypeDefinition ::=
'type' Identifier '=' Precedence0 ';'
;
Rule VariableAttribute
rule VariableAttribute ::=
'const'
| 'mut'
;
Rule Expression
rule Expression ::=
Precedence14
;
Rule Precedence14
rule Precedence14 ::=
Precedence13 '=' Precedence14
| Precedence13 '|=' Precedence14
| Precedence13 '^=' Precedence14
| Precedence13 '&=' Precedence14
| Precedence13 '<<=' Precedence14
| Precedence13 '>>=' Precedence14
| Precedence13 '+=' Precedence14
| Precedence13 '-=' Precedence14
| Precedence13 '*=' Precedence14
| Precedence13 '/=' Precedence14
| Precedence13 '%=' Precedence14
| Precedence13 '?' Precedence14 ':' Precedence14
| Precedence13
;
Rule Precedence13
rule Precedence13 ::=
Precedence13 '||' Precedence12
| Precedence12
;
Rule Precedence12
rule Precedence12 ::=
Precedence12 '&&' Precedence11
| Precedence11
;
Rule Precedence11
rule Precedence11 ::=
Precedence11 '==' Precedence10
| Precedence11 '!=' Precedence10
| Precedence10
;
Rule Precedence10
rule Precedence10 ::=
Precedence10 '<' Precedence9
| Precedence10 '>' Precedence9
| Precedence10 '<=' Precedence9
| Precedence10 '>=' Precedence9
| Precedence9
;
Rule Precedence9
rule Precedence9 ::=
Precedence9 '|' Precedence8
| Precedence8
;
Rule Precedence8
rule Precedence8 ::=
Precedence8 '^' Precedence7
| Precedence7
;
Rule Precedence7
rule Precedence7 ::=
Precedence7 '&' Precedence6
| Precedence6
;
Rule Precedence6
rule Precedence6 ::=
Precedence6 '<<' Precedence5
| Precedence6 '>>' Precedence5
| Precedence5
;
Rule Precedence5
rule Precedence5 ::=
Precedence5 '+' Precedence4
| Precedence5 '-' Precedence4
| Precedence4
;
Rule Precedence4
rule Precedence4 ::=
Precedence4 '*' Precedence3
| Precedence4 '/' Precedence3
| Precedence4 '%' Precedence3
| Precedence3
;
Rule Precedence3
rule Precedence3 ::=
Precedence2 '**' Precedence3
| Precedence2
;
Rule Precedence2
rule Precedence2 ::=
'!' Precedence2
| '~' Precedence2
| 'delete' Precedence2
| 'new' Precedence2
| Precedence0
;
Rule NamedArgument
rule NamedArgument ::=
Identifier ':' Expression
| 'address' ':' Expression
;
Rule FunctionCall
rule FunctionCall ::=
Precedence0 '(' Comma!(Expression) ')'
| Precedence0 BlockStatement
| Precedence0 '(' '{' Comma!(NamedArgument) '}' ')'
;
Rule Precedence0
rule Precedence0 ::=
Precedence0 '++'
| Precedence0 '--'
| FunctionCall
| Precedence0 '[' Expression ? ']'
| Precedence0 '[' Expression ? ':' Expression ? ']'
| Precedence0 '.' Identifier
| Type
| '[' CommaOne!(Expression) ']'
| Identifier
| ParameterList
| LiteralExpression
;
Rule LiteralExpression
rule LiteralExpression ::=
'true'
| 'false'
| Number
| HexNumber
| StringLiteral +
| AddressLiteral
| HashLiteral
;
Rule Parameter
rule Parameter ::=
Expression Identifier ?
;
Rule OptParameter
rule OptParameter ::=
Parameter ?
;
Rule ParameterList
rule ParameterList ::=
'(' ')'
| '(' Parameter ')'
| '(' CommaTwo!(OptParameter) ')'
| '(' ')'
;
Rule BlockStatementOrSemiColon
rule BlockStatementOrSemiColon ::=
';'
| BlockStatement
;
Rule FunctionDefinition
rule FunctionDefinition ::=
'fn' IdentifierOrError ParameterList ( '->' ParameterList ) ? BlockStatementOrSemiColon
;
Rule BlockStatement
rule BlockStatement ::=
'{' Statement * '}'
;
Rule OpenStatement
rule OpenStatement ::=
'if' '(' Expression ')' Statement
| 'if' '(' Expression ')' ClosedStatement 'else' OpenStatement
| 'for' '(' SimpleStatement ? ';' Expression ? ';' Expression ? ')' OpenStatement
| 'while' '(' Expression ')' OpenStatement
;
Rule ClosedStatement
rule ClosedStatement ::=
NonIfStatement
| 'if' '(' Expression ')' ClosedStatement 'else' ClosedStatement
| 'while' '(' Expression ')' ClosedStatement
| 'for' '(' SimpleStatement ? ';' Expression ? ';' Expression ? ')' ClosedStatement
| 'for' '(' SimpleStatement ? ';' Expression ? ';' Expression ? ')' ';'
;
Rule Statement
rule Statement ::=
OpenStatement
| ClosedStatement
|
;
Rule SimpleStatement
rule SimpleStatement ::=
VariableDeclaration ( '=' Expression ) ?
| Expression
;
Rule NonIfStatement
rule NonIfStatement ::=
BlockStatement
| SimpleStatement ';'
| 'do' Statement 'while' '(' Expression ')' ';'
| 'continue' ';'
| 'break' ';'
| 'return' ';'
| 'return' Expression ';'
;
Rule Comma
macro Comma<T> ::=
| CommaOne!(T)
;
Rule CommaOne
macro CommaOne<T> ::=
T ( ',' T ) *
;
Rule CommaTwo
macro CommaTwo<T> ::=
T ( ',' T ) +
;
Rule Identifier
rule Identifier ::=
'r#[$_]*[a-zA-Z][a-zA-Z$_0-9]*#'
;
Rule Number
rule Number ::=
'r#([1-9][0-9]*|0)#'
;
Rule HexNumber
rule HexNumber ::=
'r#0x[0-9A-Fa-f]+#'
;
Rule AddressLiteral
rule AddressLiteral ::=
'r#0x([0-9A-Fa-f]{64})address#'
;
Rule HashLiteral
rule HashLiteral ::=
'r#0x[0-9A-Fa-f]{64}hash#'
;
Rule StringLiteral
rule StringLiteral ::=
'r#\\[^\\]*\\#'
;