Node types:

```
{
  Type: ROOT
  Children: [](FUNCTION_DEF | IMPORT)
}

{
  Type: DECLARATION
  Value: {
    Mutable: bool
    Type: IDENTIFIER Node | nil # nil means it has to be inferred
  }
  Left: IDENTIFIER Node
  Right: expression
}

{
  Type: ASSIGNMENT
  Left: IDENTIFIER Node
  Right: expression 
}

{
  Type: CHAR_LITERAL 
  Value: byte
}

{
  Type: BLOCK
  Children: STATEMENT Node[]
}

{
  Type: FUNCTION_DEF
  Value: {
    Name: IDENTIFIER Node
    Args: {L: IDENTIFIER Node (argname), R: IDENTIFIER Node (argtype)}[]
    RetType: IDENTIFIER Node
  }
  Children: []*Node{body}
}

{
  Type: STRUCT
  Left: IDENTIFIER Node
  Value: {
    Fields: {L: IDENTIFIER Node (fieldname), R: IDENTIFIER Node (fieldtype)}[]
  }
}

{
  Type: STRUCT_LITERAL
  Left: IDENTIFIER Node
  Value: {
    Fields: {L: IDENTIFIER Node (fieldname), R: expression}[]
  }
}

{
  Type: IMPORT
  Right: IDENTIFIER Node
}

{
  Type: IF
  Value: {
    IfBranch: {
      Condition: expression
      Node: BLOCK Node
    }
    ElseIfBranches: {
      Condition: expression
      Node: BLOCK Node
    }[]
    ElseBranch: {
      Condition: nil
      Node: BLOCK Node
    }
  }
}

{
  Type: CONTROL_KEYWORD
  Value: "return" | "break" | "continue"
  Right: expression # if return had a value associated with it
}

{
  Type: FOR
  Value: {
    ExprsOrStmts: [](expression or statement),
    Body:         BLOCK Node,
  }
}

{
  Type:  UNARY_OP
  Value: "not" | "-"
  Right: expression
}

{
  Type:  BINARY_OP
  Value: "==" | "!=" | ">" | ">=" | "<" | "<=" | "+" | "-" | "*" | "/" | "%" | "and" | "or"
  Left:  expression
  Right: expression
}

{
  Type: CAST
  Left: IDENTIFIER Node
  Right: expression
}

{
  Type:  IDENTIFIER
  Right: IDENTIFIER Node | nil # linked list of . accessors, nil means it's the end or there is no . chain
  Value: string
}

{
  Type:  NUMBER_LITERAL
  Value: string
}

{
  Type:     FUNCTION_CALL
  Value:    IDENTIFIER Node
  Children: []expression
}

{
  Type: IF_EXPRESSION
  Value: {
    IfBranch: {
      Condition: expression
      Node: expression
    }
    ElseIfBranches: {
      Condition: expression
      Node: expression
    }[]
    ElseBranch: {
      Condition: nil
      Node: expression
    }
  }
}
```