Ola Language Grammar

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#\\[^\\]*\\#' 
  ;

Last updated