Skip to content

Grammar Reference ​

This is a simplified reference of Haira's grammar. For the complete formal specification, see Chapter 17 of the spec.

Program Structure ​

Program         = { Declaration } EOF
Declaration     = ImportDecl | ExportDecl | ProviderDecl | ToolDecl
                | AgentDecl | WorkflowDecl | FnDecl | StructDecl
                | EnumDecl | TypeDecl | MethodDecl | TestDecl
                | VarDecl | Statement

Keywords ​

Core Keywords ​

fn       return   if       else     for      while
in       match    struct   enum     type     pub
import   export   from     let      const    nil
true     false    break    continue defer    errdefer
try      catch    spawn    async    select   self
and      or       not      orelse   as

Agentic Keywords ​

provider  tool  agent  workflow  step
onerror   onsuccess   oncancel

Testing Keywords ​

test  assert

Reserved (Future) ​

trait  impl  unsafe  where  chan

Declarations ​

Provider ​

ProviderDecl = "provider" Identifier "{" ProviderFields "}"
ProviderFields = { Identifier ":" Expression }

Tool ​

ToolDecl = "tool" Identifier "(" Params ")" "->" Type "{" TripleQuoteString Body "}"

Agent ​

AgentDecl = "agent" Identifier "{" AgentFields "}"
AgentFields = { Identifier ":" Expression }

Workflow ​

WorkflowDecl = { Decorator } "workflow" Identifier "(" Params ")" [ "->" Type ] "{"
               { LifecycleHook }
               Body
             "}"
Decorator     = "@" Identifier [ "(" Args ")" ]
LifecycleHook = "onerror" Identifier "{" Body "}"
              | "onsuccess" "{" Body "}"
              | "oncancel" "{" Body "}"

Function ​

FnDecl = [ "pub" ] "fn" Identifier "(" Params ")" [ "->" Type ] "{" Body "}"

Method ​

MethodDecl = Identifier "." Identifier "(" Params ")" [ "->" Type ] "{" Body "}"

Struct ​

StructDecl = [ "pub" ] "struct" Identifier "{" StructFields "}"
StructFields = { Identifier [ ":" Type ] }

Enum ​

EnumDecl = [ "pub" ] "enum" Identifier "{" EnumVariants "}"
EnumVariants = { Identifier [ "(" TypeList ")" ] }

Type Alias ​

TypeDecl = "type" Identifier "=" Type

Test ​

TestDecl = "test" StringLit "{" Body "}"

Statements ​

Statement    = AssignStmt | LetStmt | IfStmt | ForStmt | WhileStmt
             | ReturnStmt | MatchStmt | TryStmt | DeferStmt | ErrDeferStmt
             | BreakStmt | ContinueStmt | StepStmt | AssertStmt | ExprStmt

StepStmt     = [ Decorator ] "step" StringLit "{" Body "}"
AssertStmt   = "assert" Expression [ "," Expression ]
DeferStmt    = "defer" ( Expression | "{" Body "}" )
ErrDeferStmt = "errdefer" ( Expression | "{" Body "}" )
TryStmt      = "try" "{" Body "}" "catch" Identifier "{" Body "}"

Expressions ​

Expression = Assignment | Binary | Unary | Call | MethodCall | Index
           | Field | Literal | Identifier | Match | If | Spawn | Select
           | Pipe | Lambda | List | Map | Instance | Range | Block
           | Propagate | Orelse | Some | None | Paren

Pipe       = Expression "|>" Expression
Binary     = Expression Op Expression
Unary      = ("!" | "-" | "~" | "not") Expression
Call       = Expression "(" Args ")"
MethodCall = Expression "." Identifier "(" Args ")"
Index      = Expression "[" Expression "]"
Field      = Expression "." Identifier
Propagate  = Expression "?"
Orelse     = Expression "orelse" Expression
Lambda     = "fn" "(" Params ")" [ "->" Type ] "{" Body "}"
Spawn      = "spawn" "{" { Expression } "}"
Instance   = Identifier "{" { Identifier ":" Expression } "}"
Range      = Expression ( ".." | "..=" ) Expression

Operators (Precedence) ​

From highest to lowest:

PrecedenceOperatorsAssociativity
1 (highest)() [] . ?. (postfix)Left
2! - ~ not (unary)Right
3* / %Left
4+ -Left
5<< >>Left
6&Left
7^Left
8|Left
9.. ..=Left
10|>Left
11< > <= >=Left
12== !=Left
13and &&Left
14or ||Left
15 (lowest)= += -= *= /= &= |= ^= <<= >>=Right

Types ​

Type = "int" | "i8" | "i16" | "i32" | "i64"
     | "u8" | "u16" | "u32" | "u64"
     | "float" | "f32" | "f64"
     | "string" | "bool" | "nil" | "file"
     | "[" "]" Type                      // List: [int]
     | "[" Type ":" Type "]"             // Map: [string:int]
     | "(" TypeList ")"                  // Tuple: (int, string)
     | Type "?"                          // Option: int?
     | "stream"                          // SSE stream
     | "fn" "(" TypeList ")" "->" Type   // Function type
     | "{" FieldList "}"                 // Anonymous struct
     | Identifier                        // Named type

Import Forms ​

ImportDecl = "import" StringLit                           // Basic
           | "import" Identifier "from" StringLit         // Aliased
           | "import" "{" IdentList "}" "from" StringLit  // Selective
           | "import" "*" "from" StringLit                // Glob

Match Expression ​

MatchExpr = "match" Expression "{" { MatchArm } "}"
MatchArm  = Pattern [ "if" Expression ] "=>" Expression ","
Pattern   = Literal | Identifier | "_"
          | Identifier "." Identifier [ "(" PatternList ")" ]  // Constructor
          | Pattern "|" Pattern                                // Or-pattern
          | Expression ".." Expression                         // Range (exclusive)
          | Expression "..=" Expression                        // Range (inclusive)

Released under the Apache-2.0 License.