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' 
  |  'field' 
  |  'u32' 
  |  'u64' 
  |  'u256' 
  ;

Rule IdentifierOrError

IdentifierOrError

rule IdentifierOrError ::=
    Identifier 
  | 
  ;

Rule VariableDeclaration

VariableDeclaration

rule VariableDeclaration ::=
    Precedence0 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 
  | Precedence0 
  ;

Rule NamedArgument

NamedArgument

rule NamedArgument ::=
    Identifier  ':' Expression 
  ;

Rule FunctionCall

FunctionCall

rule FunctionCall ::=
    Precedence0  '(' Comma!(Expression)  ')' 
  | 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 
  ;

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 ?   ';' SimpleStatement ?   ')' OpenStatement 
  ;

Rule ClosedStatement

ClosedStatement

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

Rule Statement

Statement

rule Statement ::=
    OpenStatement 
  | ClosedStatement 
  | 
  ;

Rule SimpleStatement

SimpleStatement

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

Rule NonIfStatement

NonIfStatement

rule NonIfStatement ::=
    BlockStatement 
  | SimpleStatement  ';' 
  |  '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 Number

Number

rule Number ::=
     'r#([1-9][0-9]*|0)(u|ll|l)?#' 
  |  'r#0x[0-9A-Fa-f]*(u|ll|l)?#' 
  ;

Rule Identifier

Identifier

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

Rule StringLiteral

StringLiteral

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