Ola language
  • Introduction
  • 🏃‍♂️Quick Start
  • 👀Ola Examples
  • 👏Ola Language
    • Variables
    • Data Types
    • Operators
    • Control Flow
    • Functions
    • Event
    • Contracts
    • Interfaces and Librariese
    • Import
    • Comment Lines
    • Features TODO
  • Standard Libraries
    • CoreLib Functions
    • Prophet Functions
  • Ola Language ABI
  • Ola Compiler
    • Compiler Frontend
    • Compiler Backend
  • Ola Language Grammar
  • Appendix
Powered by GitBook
On this page
  • Rule SourceUnit
  • Rule SourceUnitPart
  • Rule ImportDirective
  • Rule Type
  • Rule StorageLocation
  • Rule IdentifierOrError
  • Rule VariableDeclaration
  • Rule StructDefinition
  • Rule ContractPart
  • Rule ContractDefinition
  • Rule EnumDefinition
  • Rule VariableDefinition
  • Rule TypeDefinition
  • Rule VariableAttribute
  • Rule Expression
  • Rule Precedence14
  • Rule Precedence13
  • Rule Precedence12
  • Rule Precedence11
  • Rule Precedence10
  • Rule Precedence9
  • Rule Precedence8
  • Rule Precedence7
  • Rule Precedence6
  • Rule Precedence5
  • Rule Precedence4
  • Rule Precedence3
  • Rule Precedence2
  • Rule NamedArgument
  • Rule FunctionCall
  • Rule Precedence0
  • Rule LiteralExpression
  • Rule Parameter
  • Rule OptParameter
  • Rule ParameterList
  • Rule BlockStatementOrSemiColon
  • Rule FunctionDefinition
  • Rule BlockStatement
  • Rule OpenStatement
  • Rule ClosedStatement
  • Rule Statement
  • Rule SimpleStatement
  • Rule NonIfStatement
  • Rule Comma
  • Rule CommaOne
  • Rule CommaTwo
  • Rule Identifier
  • Rule Number
  • Rule HexNumber
  • Rule AddressLiteral
  • Rule HashLiteral
  • Rule StringLiteral
Edit on GitHub

Ola Language Grammar

PreviousCompiler BackendNextAppendix

Last updated 1 year ago

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#\\[^\\]*\\#' 
  ;
SourceUnit
SourceUnitPart
ImportDirective
Type
StorageLocation
IdentifierOrError
VariableDeclaration
StructDefinition
ContractPart
ContractDefinition
EnumDefinition
VariableDefinition
TypeDefinition
VariableAttribute
Expression
Precedence14
Precedence13
Precedence12
Precedence11
Precedence10
Precedence9
Precedence8
Precedence7
Precedence6
Precedence5
Precedence4
Precedence3
Precedence2
NamedArgument
FunctionCall
Precedence0
LiteralExpression
Parameter
OptParameter
ParameterList
BlockStatementOrSemiColon
FunctionDefinition
BlockStatement
OpenStatement
ClosedStatement
Statement
SimpleStatement
NonIfStatement
Comma
CommaOne
CommaTwo
Identifier
Number
HexNumber
AddressLiteral
HashLiteral
StringLiteral