> For the complete documentation index, see [llms.txt](https://ola-foundation.gitbook.io/ola-lang/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ola-foundation.gitbook.io/ola-lang/full.md).

# Ola Language Grammar

## Rule SourceUnit

![SourceUnit](/files/FP8wVZJegmfoNYkgn6Rs)

```ebnf
rule SourceUnit ::=
    SourceUnitPart *  
  ;

```

## Rule SourceUnitPart

![SourceUnitPart](/files/hg0F2tpyW4XIXJT3ofAa)

```ebnf
rule SourceUnitPart ::=
    ContractDefinition 
  | ImportDirective 
  ;

```

## Rule ImportDirective

![ImportDirective](/files/lNLgwu9FWjaPJ6PaMhow)

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

```

## Rule Type

![Type](/files/AmRZspiG7yvry4X9RCEU)

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

```

## Rule StorageLocation

![StorageLocation](/files/x1BfGETwol44uUijAgup)

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

```

## Rule IdentifierOrError

![IdentifierOrError](/files/WPwnOjIHTOP7P5zMAVb1)

```ebnf
rule IdentifierOrError ::=
    Identifier 
  | 
  ;

```

## Rule VariableDeclaration

![VariableDeclaration](/files/jrVMkwgzIuNeC1CHpm6j)

```ebnf
rule VariableDeclaration ::=
    Precedence0 StorageLocation ?  IdentifierOrError 
  ;

```

## Rule StructDefinition

![StructDefinition](/files/LvoXToMXdJGBgMfjhv7Q)

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

```

## Rule ContractPart

![ContractPart](/files/8V8d5AsJMtxOg7neWvkl)

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

```

## Rule ContractDefinition

![ContractDefinition](/files/RKbj77RZ0OneEHllQ54u)

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

```

## Rule EnumDefinition

![EnumDefinition](/files/EVSybl51w7SE2XKwTLAD)

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

```

## Rule VariableDefinition

![VariableDefinition](/files/wTihW4FPPxZ9fyrUncj7)

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

```

## Rule TypeDefinition

![TypeDefinition](/files/ojO2ccYihYmeRb5jyzVw)

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

```

## Rule VariableAttribute

![VariableAttribute](/files/A68RdRSJ3qNjW6dZPGki)

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

```

## Rule Expression

![Expression](/files/K58BW8fmBsAOdBlukWjm)

```ebnf
rule Expression ::=
    Precedence14 
  ;

```

## Rule Precedence14

![Precedence14](/files/pyxEyFwqOLsddpcGKeDP)

```ebnf
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](/files/PTwinzoZhEFFnYsYY9mW)

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

```

## Rule Precedence12

![Precedence12](/files/gcbNLR6eZ4zl79z1AY5k)

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

```

## Rule Precedence11

![Precedence11](/files/Rx2feNC8wC7ZhnYraPqZ)

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

```

## Rule Precedence10

![Precedence10](/files/3algciqK2C4jXcSvJZxP)

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

```

## Rule Precedence9

![Precedence9](/files/E7nY5Ss7nREjk6sgkuZ3)

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

```

## Rule Precedence8

![Precedence8](/files/YbBsjg59RaVcfFH3Wvdg)

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

```

## Rule Precedence7

![Precedence7](/files/s6nCAUzmqd3QJa7qkvSK)

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

```

## Rule Precedence6

![Precedence6](/files/Hrw1d8jgmdkoVt8FkqPS)

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

```

## Rule Precedence5

![Precedence5](/files/GUXXxZweNAR0BTG25hzI)

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

```

## Rule Precedence4

![Precedence4](/files/e9ludlAZKj4qpRKXuIx9)

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

```

## Rule Precedence3

![Precedence3](/files/CZnJxbD0B8l0zdotSVrP)

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

```

## Rule Precedence2

![Precedence2](/files/F8wgNXOdrWyjHKiNid24)

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

```

## Rule NamedArgument

![NamedArgument](/files/Ao3ENxz2Q0q9ypxFcISE)

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

```

## Rule FunctionCall

![FunctionCall](/files/yFfTDc0o5xOR807WbbaQ)

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

```

## Rule Precedence0

![Precedence0](/files/S6qjIAT8wjpS28kFz4Kt)

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

```

## Rule LiteralExpression

![LiteralExpression](/files/QprQUL2kGVWFRZ7HLy5u)

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

```

## Rule Parameter

![Parameter](/files/GbvTWdrVpQHALHTa1cFB)

```ebnf
rule Parameter ::=
    Expression Identifier ?  
  ;

```

## Rule OptParameter

![OptParameter](/files/SxcrElTphKryH3x7WF4R)

```ebnf
rule OptParameter ::=
    Parameter ?  
  ;

```

## Rule ParameterList

![ParameterList](/files/zkLPQXpqmsBCHwdwfgnO)

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

```

## Rule BlockStatementOrSemiColon

![BlockStatementOrSemiColon](/files/v8CWAqIrtVEL0e8VyKPT)

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

```

## Rule FunctionDefinition

![FunctionDefinition](/files/qQyRU6NjAvbrrknUgdsn)

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

```

## Rule BlockStatement

![BlockStatement](/files/mxGfTC6kHWSl43njdS3E)

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

```

## Rule OpenStatement

![OpenStatement](/files/TS6GHGZH3PgyIcQd3hww)

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

```

## Rule ClosedStatement

![ClosedStatement](/files/Az6fszv2bZDfOrmRGxYQ)

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

```

## Rule Statement

![Statement](/files/6vqtiohi6DNvqXmY3y5L)

```ebnf
rule Statement ::=
    OpenStatement 
  | ClosedStatement 
  | 
  ;

```

## Rule SimpleStatement

![SimpleStatement](/files/J3TpVNU0IpXcJpmkJz55)

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

```

## Rule NonIfStatement

![NonIfStatement](/files/9ECgVsZOn87YZ2Qy6VVU)

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

```

## Rule Comma

![Comma](/files/v46xsox8bpQj2UkH4Vtx)

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

```

## Rule CommaOne

![CommaOne](/files/hOsMeR0R76CmRssKQ1kv)

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

```

## Rule CommaTwo

![CommaTwo](/files/XXlfqeAaGskYCnt3cBGL)

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

```

## Rule Identifier

![Identifier](/files/y093YBPEMbb4Ofjuuk1W)

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

```

## Rule Number

![Number](/files/mnt0kvwE3n2Ab1tksjnd)

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

```

## Rule HexNumber

![HexNumber](/files/Y6MEkhzocyQyBwMS0y9Z)

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

```

## Rule AddressLiteral

![AddressLiteral](/files/3LIyp7nQOGhqGceTdWJI)

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

```

## Rule HashLiteral

![HashLiteral](/files/TRqPUtUnsvFF1DwtYK36)

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

```

## Rule StringLiteral

![StringLiteral](/files/Kg04oXhgz5qPpje5LXkv)

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

```
