Ola Language Grammar

Rule SourceUnit

SourceUnit
rule SourceUnit ::=
    SourceUnitPart *  
  ;

Rule SourceUnitPart

SourceUnitPart
rule SourceUnitPart ::=
    ContractDefinition 
  | ImportDirective 
  ;

Rule ImportDirective

ImportDirective
rule ImportDirective ::=
     'import' StringLiteral  ';' 
  |  'import' StringLiteral  'as' Identifier  ';' 
  ;

Rule Type

Type
rule Type ::=
     'bool' 
  |  'u32' 
  |  'u64' 
  |  'u256' 
  |  'address' 
  |  'field' 
  |  'hash' 
  |  'fields' 
  |  'string' 
  |  'mapping'  '(' Precedence0 Identifier ?   '=>' Precedence0 Identifier ?   ')' 
  ;

Rule StorageLocation

StorageLocation
rule StorageLocation ::=
     'memory' 
  |  'storage' 
  ;

Rule IdentifierOrError

IdentifierOrError
rule IdentifierOrError ::=
    Identifier 
  | 
  ;

Rule VariableDeclaration

VariableDeclaration
rule VariableDeclaration ::=
    Precedence0 StorageLocation ?  IdentifierOrError 
  ;

Rule StructDefinition

StructDefinition
rule StructDefinition ::=
     'struct' IdentifierOrError  '{' ( VariableDeclaration  ';' ) *   '}' 
  ;

Rule ContractPart

ContractPart
rule ContractPart ::=
    StructDefinition 
  | EnumDefinition 
  | VariableDefinition 
  | FunctionDefinition 
  | TypeDefinition 
  |  ';' 
  ;

Rule ContractDefinition

ContractDefinition
rule ContractDefinition ::=
     'contract' IdentifierOrError  '{' ( ContractPart ) *   '}' 
  ;

Rule EnumDefinition

EnumDefinition
rule EnumDefinition ::=
     'enum' IdentifierOrError  '{' Comma!(IdentifierOrError)  '}' 
  ;

Rule VariableDefinition

VariableDefinition
rule VariableDefinition ::=
    Precedence0 VariableAttribute *  IdentifierOrError (  '=' Expression ) ?   ';' 
  | Precedence0 VariableAttribute *  Identifier  ';' 
  ;

Rule TypeDefinition

TypeDefinition
rule TypeDefinition ::=
     'type' Identifier  '=' Precedence0  ';' 
  ;

Rule VariableAttribute

VariableAttribute
rule VariableAttribute ::=
     'const' 
  |  'mut' 
  ;

Rule Expression

Expression
rule Expression ::=
    Precedence14 
  ;

Rule Precedence14

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

Precedence13
rule Precedence13 ::=
    Precedence13  '||' Precedence12 
  | Precedence12 
  ;

Rule Precedence12

Precedence12
rule Precedence12 ::=
    Precedence12  '&&' Precedence11 
  | Precedence11 
  ;

Rule Precedence11

Precedence11
rule Precedence11 ::=
    Precedence11  '==' Precedence10 
  | Precedence11  '!=' Precedence10 
  | Precedence10 
  ;

Rule Precedence10

Precedence10
rule Precedence10 ::=
    Precedence10  '<' Precedence9 
  | Precedence10  '>' Precedence9 
  | Precedence10  '<=' Precedence9 
  | Precedence10  '>=' Precedence9 
  | Precedence9 
  ;

Rule Precedence9

Precedence9
rule Precedence9 ::=
    Precedence9  '|' Precedence8 
  | Precedence8 
  ;

Rule Precedence8

Precedence8
rule Precedence8 ::=
    Precedence8  '^' Precedence7 
  | Precedence7 
  ;

Rule Precedence7

Precedence7
rule Precedence7 ::=
    Precedence7  '&' Precedence6 
  | Precedence6 
  ;

Rule Precedence6

Precedence6
rule Precedence6 ::=
    Precedence6  '<<' Precedence5 
  | Precedence6  '>>' Precedence5 
  | Precedence5 
  ;

Rule Precedence5

Precedence5
rule Precedence5 ::=
    Precedence5  '+' Precedence4 
  | Precedence5  '-' Precedence4 
  | Precedence4 
  ;

Rule Precedence4

Precedence4
rule Precedence4 ::=
    Precedence4  '*' Precedence3 
  | Precedence4  '/' Precedence3 
  | Precedence4  '%' Precedence3 
  | Precedence3 
  ;

Rule Precedence3

Precedence3
rule Precedence3 ::=
    Precedence2  '**' Precedence3 
  | Precedence2 
  ;

Rule Precedence2

Precedence2
rule Precedence2 ::=
     '!' Precedence2 
  |  '~' Precedence2 
  |  'delete' Precedence2 
  |  'new' Precedence2 
  | Precedence0 
  ;

Rule NamedArgument

NamedArgument
rule NamedArgument ::=
    Identifier  ':' Expression 
  |  'address'  ':' Expression 
  ;

Rule FunctionCall

FunctionCall
rule FunctionCall ::=
    Precedence0  '(' Comma!(Expression)  ')' 
  | Precedence0 BlockStatement 
  | Precedence0  '('  '{' Comma!(NamedArgument)  '}'  ')' 
  ;

Rule Precedence0

Precedence0
rule Precedence0 ::=
    Precedence0  '++' 
  | Precedence0  '--' 
  | FunctionCall 
  | Precedence0  '[' Expression ?   ']' 
  | Precedence0  '[' Expression ?   ':' Expression ?   ']' 
  | Precedence0  '.' Identifier 
  | Type 
  |  '[' CommaOne!(Expression)  ']' 
  | Identifier 
  | ParameterList 
  | LiteralExpression 
  ;

Rule LiteralExpression

LiteralExpression
rule LiteralExpression ::=
     'true' 
  |  'false' 
  | Number 
  | HexNumber 
  | StringLiteral +  
  | AddressLiteral 
  | HashLiteral 
  ;

Rule Parameter

Parameter
rule Parameter ::=
    Expression Identifier ?  
  ;

Rule OptParameter

OptParameter
rule OptParameter ::=
    Parameter ?  
  ;

Rule ParameterList

ParameterList
rule ParameterList ::=
     '('  ')' 
  |  '(' Parameter  ')' 
  |  '(' CommaTwo!(OptParameter)  ')' 
  |  '('  ')' 
  ;

Rule BlockStatementOrSemiColon

BlockStatementOrSemiColon
rule BlockStatementOrSemiColon ::=
     ';' 
  | BlockStatement 
  ;

Rule FunctionDefinition

FunctionDefinition
rule FunctionDefinition ::=
     'fn' IdentifierOrError ParameterList (  '->' ParameterList ) ?  BlockStatementOrSemiColon 
  ;

Rule BlockStatement

BlockStatement
rule BlockStatement ::=
     '{' Statement *   '}' 
  ;

Rule OpenStatement

OpenStatement
rule OpenStatement ::=
     'if'  '(' Expression  ')' Statement 
  |  'if'  '(' Expression  ')' ClosedStatement  'else' OpenStatement 
  |  'for'  '(' SimpleStatement ?   ';' Expression ?   ';' Expression ?   ')' OpenStatement 
  |  'while'  '(' Expression  ')' OpenStatement 
  ;

Rule ClosedStatement

ClosedStatement
rule ClosedStatement ::=
    NonIfStatement 
  |  'if'  '(' Expression  ')' ClosedStatement  'else' ClosedStatement 
  |  'while'  '(' Expression  ')' ClosedStatement 
  |  'for'  '(' SimpleStatement ?   ';' Expression ?   ';' Expression ?   ')' ClosedStatement 
  |  'for'  '(' SimpleStatement ?   ';' Expression ?   ';' Expression ?   ')'  ';' 
  ;

Rule Statement

Statement
rule Statement ::=
    OpenStatement 
  | ClosedStatement 
  | 
  ;

Rule SimpleStatement

SimpleStatement
rule SimpleStatement ::=
    VariableDeclaration (  '=' Expression ) ?  
  | Expression 
  ;

Rule NonIfStatement

NonIfStatement
rule NonIfStatement ::=
    BlockStatement 
  | SimpleStatement  ';' 
  |  'do' Statement  'while'  '(' Expression  ')'  ';' 
  |  'continue'  ';' 
  |  'break'  ';' 
  |  'return'  ';' 
  |  'return' Expression  ';' 
  ;

Rule Comma

Comma
macro Comma<T> ::=
    
  | CommaOne!(T) 
  ;

Rule CommaOne

CommaOne
macro CommaOne<T> ::=
    T (  ',' T ) *  
  ;

Rule CommaTwo

CommaTwo
macro CommaTwo<T> ::=
    T (  ',' T ) +  
  ;

Rule Identifier

Identifier
rule Identifier ::=
     'r#[$_]*[a-zA-Z][a-zA-Z$_0-9]*#' 
  ;

Rule Number

Number
rule Number ::=
     'r#([1-9][0-9]*|0)#' 
  ;

Rule HexNumber

HexNumber
rule HexNumber ::=
     'r#0x[0-9A-Fa-f]+#' 
  ;

Rule AddressLiteral

AddressLiteral
rule AddressLiteral ::=
     'r#0x([0-9A-Fa-f]{64})address#' 
  ;

Rule HashLiteral

HashLiteral
rule HashLiteral ::=
     'r#0x[0-9A-Fa-f]{64}hash#' 
  ;

Rule StringLiteral

StringLiteral
rule StringLiteral ::=
     'r#\\[^\\]*\\#' 
  ;

Last updated