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: 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: 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: IDENTIFIER
Value: string
}
{
Type: NUMBER_LITERAL
Value: string
}
{
Type: FUNCTION_CALL
Value: IDENTIFIER Node
Children: []expression
}
{
Type: IF_EXPRESSION
Value: {
IfBranch: expression
ElseIfBranches: {
Condition: expression | nil
Node: expression
}[]
}
}
```