==================
tick symbols
==================

discard `!$`
discard `!&`
discard `!*\`
discard `!*`
discard `!=`
discard `!`
discard `$$`
discard `$`
discard `%%`
discard `%*`
discard `%=`
discard `%`
discard `&=`
discard `&`
discard `>%`
discard `>=%`
discard `>=`
discard `>`
discard `<%`
discard `<>`
discard `<->`
discard `<=%`
discard `<=`
discard `<`
discard `'big`
discard `*%`
discard `**`
discard `*=`
discard `*`
discard `+%`
discard `++`
discard `+=`
discard `+`
discard `-%`
discard `->`
discard `-+-`
discard `--`
discard `-=`
discard `-`
discard `.()`
discard `..<`
discard `..^`
discard `..`
discard `.=`
discard `.`
discard `/%`
discard `/../`
discard `//`
discard `/=`
discard `/`
discard `=>`
discard `==`
discard `=`
discard `=copy`
discard `=destroy`
discard `=sink`
discard `=trace`
discard `=~`
discard `?.`
discard `??.`
discard `?`
discard `@`
discard `[]=`
discard `[]`
discard `^`
discard `addr`
discard `and`
discard `div`
discard `in`
discard `is`
discard `isnot`
discard `mod`
discard `not`
discard `notin`
discard `object`
discard `of`
discard `or`
discard `ptr`
discard `ref`
discard `shl`
discard `shr`
discard `static`
discard `template`
discard `type`
discard `var`
discard `xor`
discard `{}=`
discard `{}`
discard `|`
discard `||`

---

(module
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator)
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator)
            (operator)
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator)
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator)
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator)
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator)
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator)
            (operator)
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator)
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator)
            (operator)
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator)
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (operator)))))))


==================
typeDef simple types
==================

type a = int
type c.b = int
type
  e = int
  d = int
type f[T] = int
type g[T] = int
type h{.deprecated.} = int
type i[T]{.deprecated.} = int
type j[T] = var ref int not nil

---

(module
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (symbol
            (ident))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (symbol
          (ident))
        (primaryTypeDef
          (symbol
            (ident))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (symbol
            (ident)))
        (symbol
          (ident))
        (primaryTypeDef
          (symbol
            (ident))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (genericParamList
          (genericParam
            (symbol
              (ident))))
        (primaryTypeDef
          (symbol
            (ident))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (genericParamList
          (genericParam
            (symbol
              (ident))))
        (primaryTypeDef
          (symbol
            (ident))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (pragma
          (exprColonEqExpr
            (expr
              (primary
                (symbol
                  (ident))))))
        (primaryTypeDef
          (symbol
            (ident))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (genericParamList
          (genericParam
            (symbol
              (ident))))
        (pragma
          (exprColonEqExpr
            (expr
              (primary
                (symbol
                  (ident))))))
        (primaryTypeDef
          (symbol
            (ident))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (genericParamList
          (genericParam
            (symbol
              (ident))))
        (primaryTypeDef
          (primaryPrefix
            (keyw))
          (primaryPrefix
            (keyw))
          (symbol
            (ident)))
        (keyw)
        (nil_lit)))))

==================
routineExprTypeDesc
==================

type
  a* = proc
  b* = proc()
  c* = proc(x, y: int)
  d* = proc: int {.gcsafe.}
  e* = proc {.gcsafe.}
  f* = proc(a: int): int {.gcsafe.}
  g* = proc(cb: proc(cb: proc(): int))
  o* = object
    b* : proc()
    c* : proc(x, y: int)
    d* : proc: int {.gcsafe.}
    e* : proc() {.gcsafe.}
    f: proc(a: int): int {.gcsafe.}
    g* : proc(cb: proc(cb: proc(): int))

---

(module
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (opr)
        (primaryTypeDef
          (routineExprTypeDesc
            (keyw)))
        (symbol
          (ident))
        (opr)
        (primaryTypeDef
          (routineExprTypeDesc
            (keyw)
            (paramList)))
        (symbol
          (ident))
        (opr)
        (primaryTypeDef
          (routineExprTypeDesc
            (keyw)
            (paramList
              (paramColonEquals
                (symbol
                  (ident))
                (symbol
                  (ident))
                (typeDesc
                  (primaryTypeDesc
                    (symbol
                      (ident))))))))
        (symbol
          (ident))
        (opr)
        (primaryTypeDef
          (routineExprTypeDesc
            (keyw)
            (paramListColon
              (typeDesc
                (primaryTypeDesc
                  (symbol
                    (ident)))))
            (pragma
              (exprColonEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))))
        (symbol
          (ident))
        (opr)
        (primaryTypeDef
          (routineExprTypeDesc
            (keyw)
            (pragma
              (exprColonEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))))
        (symbol
          (ident))
        (opr)
        (primaryTypeDef
          (routineExprTypeDesc
            (keyw)
            (paramList
              (paramColonEquals
                (symbol
                  (ident))
                (typeDesc
                  (primaryTypeDesc
                    (symbol
                      (ident))))))
            (paramListColon
              (typeDesc
                (primaryTypeDesc
                  (symbol
                    (ident)))))
            (pragma
              (exprColonEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))))
        (symbol
          (ident))
        (opr)
        (primaryTypeDef
          (routineExprTypeDesc
            (keyw)
            (paramList
              (paramColonEquals
                (symbol
                  (ident))
                (typeDesc
                  (primaryTypeDesc
                    (routineExprTypeDesc
                      (keyw)
                      (paramList
                        (paramColonEquals
                          (symbol
                            (ident))
                          (typeDesc
                            (primaryTypeDesc
                              (routineExprTypeDesc
                                (keyw)
                                (paramList)
                                (paramListColon
                                  (typeDesc
                                    (primaryTypeDesc
                                      (symbol
                                        (ident)))))))))))))))))
        (symbol
          (ident))
        (opr)
        (primaryTypeDef
          (objectDecl
            (keyw)
            (objectPart
              (symbol
                (ident))
              (opr)
              (typeDesc
                (primaryTypeDesc
                  (routineExprTypeDesc
                    (keyw)
                    (paramList)))))
            (objectPart
              (symbol
                (ident))
              (opr)
              (typeDesc
                (primaryTypeDesc
                  (routineExprTypeDesc
                    (keyw)
                    (paramList
                      (paramColonEquals
                        (symbol
                          (ident))
                        (symbol
                          (ident))
                        (typeDesc
                          (primaryTypeDesc
                            (symbol
                              (ident))))))))))
            (objectPart
              (symbol
                (ident))
              (opr)
              (typeDesc
                (primaryTypeDesc
                  (routineExprTypeDesc
                    (keyw)
                    (paramListColon
                      (typeDesc
                        (primaryTypeDesc
                          (symbol
                            (ident)))))
                    (pragma
                      (exprColonEqExpr
                        (expr
                          (primary
                            (symbol
                              (ident))))))))))
            (objectPart
              (symbol
                (ident))
              (opr)
              (typeDesc
                (primaryTypeDesc
                  (routineExprTypeDesc
                    (keyw)
                    (paramList)
                    (pragma
                      (exprColonEqExpr
                        (expr
                          (primary
                            (symbol
                              (ident))))))))))
            (objectPart
              (symbol
                (ident))
              (typeDesc
                (primaryTypeDesc
                  (routineExprTypeDesc
                    (keyw)
                    (paramList
                      (paramColonEquals
                        (symbol
                          (ident))
                        (typeDesc
                          (primaryTypeDesc
                            (symbol
                              (ident))))))
                    (paramListColon
                      (typeDesc
                        (primaryTypeDesc
                          (symbol
                            (ident)))))
                    (pragma
                      (exprColonEqExpr
                        (expr
                          (primary
                            (symbol
                              (ident))))))))))
            (objectPart
              (symbol
                (ident))
              (opr)
              (typeDesc
                (primaryTypeDesc
                  (routineExprTypeDesc
                    (keyw)
                    (paramList
                      (paramColonEquals
                        (symbol
                          (ident))
                        (typeDesc
                          (primaryTypeDesc
                            (routineExprTypeDesc
                              (keyw)
                              (paramList
                                (paramColonEquals
                                  (symbol
                                    (ident))
                                  (typeDesc
                                    (primaryTypeDesc
                                      (routineExprTypeDesc
                                        (keyw)
                                        (paramList)
                                        (paramListColon
                                          (typeDesc
                                            (primaryTypeDesc
                                              (symbol
                                                (ident)))))))))))))))))))))))))

==================
subrange types
==================

type
  a = x..5
  b = 0..x
  c = range[0..5]

---

(module
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (subrangeDecl
            (symbol
              (ident))
            (int_lit)))
        (symbol
          (ident))
        (primaryTypeDef
          (subrangeDecl
            (int_lit)
            (symbol
              (ident))))
        (symbol
          (ident))
        (primaryTypeDef
          (symbol
            (ident))
          (primarySuffix
            (indexSuffix
              (exprColonEqExprList
                (exprColonEqExpr
                  (expr
                    (primary
                      (literal
                        (int_lit)))
                    (operator)
                    (primary
                      (literal
                        (int_lit)))))))))))))

==================
constant simple
==================

const a = 9
const b:int = 9
const c{.deprecated.} = 9
const 
  d{.deprecated.}:int = 9
  (e, f) = (9, 9)
  (g{.deprecated.}, h) = (9, 9)

---

(module
  (stmt
    (declaration
      (variable
        (keyw)
        (declColonEquals
          (symbol
            (ident))
          (expr
            (primary
              (literal
                (int_lit))))))))
  (stmt
    (declaration
      (variable
        (keyw)
        (declColonEquals
          (symbol
            (ident))
          (typeDesc
            (primaryTypeDesc
              (symbol
                (ident))))
          (expr
            (primary
              (literal
                (int_lit))))))))
  (stmt
    (declaration
      (variable
        (keyw)
        (declColonEquals
          (symbol
            (ident))
          (pragma
            (exprColonEqExpr
              (expr
                (primary
                  (symbol
                    (ident))))))
          (expr
            (primary
              (literal
                (int_lit))))))))
  (stmt
    (declaration
      (variable
        (keyw)
        (declColonEquals
          (symbol
            (ident))
          (pragma
            (exprColonEqExpr
              (expr
                (primary
                  (symbol
                    (ident))))))
          (typeDesc
            (primaryTypeDesc
              (symbol
                (ident))))
          (expr
            (primary
              (literal
                (int_lit)))))
        (varTuple
          (symbol
            (ident))
          (symbol
            (ident))
          (expr
            (primary
              (tupleConstr
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit)))))
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit)))))))))
        (varTuple
          (symbol
            (ident))
          (pragma
            (exprColonEqExpr
              (expr
                (primary
                  (symbol
                    (ident))))))
          (symbol
            (ident))
          (expr
            (primary
              (tupleConstr
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit)))))
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit)))))))))))))

==================
variable simple
==================

let a = 9
var `b` = 9
using c: int
var (d) = (9,)
var (dd,) = (9,)
var (e, f) = (9, 9)
let (`g`{.deprecated.}, h) = (9, 9)
var 
  i{.deprecated.}:int = 9
  (j, k) = (9, 9)
  (l{.deprecated.}, m) = (9, 9)

---

(module
  (stmt
    (declaration
      (variable
        (keyw)
        (declColonEquals
          (symbol
            (ident))
          (expr
            (primary
              (literal
                (int_lit))))))))
  (stmt
    (declaration
      (variable
        (keyw)
        (declColonEquals
          (symbol
            (ident))
          (expr
            (primary
              (literal
                (int_lit))))))))
  (stmt
    (declaration
      (variable
        (keyw)
        (declColonEquals
          (symbol
            (ident))
          (typeDesc
            (primaryTypeDesc
              (symbol
                (ident))))))))
  (stmt
    (declaration
      (variable
        (keyw)
        (varTuple
          (symbol
            (ident))
          (expr
            (primary
              (tupleConstr
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit))))))))))))
  (stmt
    (declaration
      (variable
        (keyw)
        (varTuple
          (symbol
            (ident))
          (expr
            (primary
              (tupleConstr
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit))))))))))))
  (stmt
    (declaration
      (variable
        (keyw)
        (varTuple
          (symbol
            (ident))
          (symbol
            (ident))
          (expr
            (primary
              (tupleConstr
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit)))))
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit))))))))))))
  (stmt
    (declaration
      (variable
        (keyw)
        (varTuple
          (symbol
            (ident))
          (pragma
            (exprColonEqExpr
              (expr
                (primary
                  (symbol
                    (ident))))))
          (symbol
            (ident))
          (expr
            (primary
              (tupleConstr
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit)))))
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit))))))))))))
  (stmt
    (declaration
      (variable
        (keyw)
        (declColonEquals
          (symbol
            (ident))
          (pragma
            (exprColonEqExpr
              (expr
                (primary
                  (symbol
                    (ident))))))
          (typeDesc
            (primaryTypeDesc
              (symbol
                (ident))))
          (expr
            (primary
              (literal
                (int_lit)))))
        (varTuple
          (symbol
            (ident))
          (symbol
            (ident))
          (expr
            (primary
              (tupleConstr
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit)))))
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit)))))))))
        (varTuple
          (symbol
            (ident))
          (pragma
            (exprColonEqExpr
              (expr
                (primary
                  (symbol
                    (ident))))))
          (symbol
            (ident))
          (expr
            (primary
              (tupleConstr
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit)))))
                (symbolColonExpr
                  (expr
                    (primary
                      (literal
                        (int_lit)))))))))))))

==================
tupleDecl
==================

type a = distinct tuple
  x: int
type b = tuple[x: int, y,z: int; w: int]
type 
  c = tuple
    x: int
  d = tuple[x: int]
var x: tuple[x: int; y, z: int]

---

(module
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (primaryPrefix
            (keyw))
          (tupleDecl
            (keyw)
            (identColon
              (ident)
              (typeDesc
                (primaryTypeDesc
                  (symbol
                    (ident))))))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (tupleDecl
              (keyw)
              (identColon
                (ident)
                (typeDesc
                  (primaryTypeDesc
                    (symbol
                      (ident)))))
              (identColon
                (ident)
                (ident)
                (typeDesc
                  (primaryTypeDesc
                    (symbol
                      (ident)))))
              (identColon
                (ident)
                (typeDesc
                  (primaryTypeDesc
                    (symbol
                      (ident))))))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (tupleDecl
            (keyw)
            (identColon
              (ident)
              (typeDesc
                (primaryTypeDesc
                  (symbol
                    (ident)))))))
        (symbol
          (ident))
        (primaryTypeDef
          (tupleDecl
              (keyw)
              (identColon
                (ident)
                (typeDesc
                  (primaryTypeDesc
                    (symbol
                      (ident))))))))))
  (stmt
    (declaration
      (variable
        (keyw)
        (declColonEquals
          (symbol
            (ident))
          (typeDesc
            (primaryTypeDesc
              (tupleDesc
                (keyw)
                (identColon
                  (ident)
                  (typeDesc
                    (primaryTypeDesc
                      (symbol
                        (ident)))))
                (identColon
                  (ident)
                  (ident)
                  (typeDesc
                    (primaryTypeDesc
                      (symbol
                        (ident)))))))))))))

==================
enumDecl
==================

type a = enum
  A{.deprecated.} = 9,
  B{.deprecated.}
  C
  D = 17
type b {.pure.} = enum A{.deprecated.} = 9, B{.deprecated.} C D = 17

---

(module
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (enumDecl
            (keyw)
            (enumElement
              (symbol
                (ident))
              (pragma
                (exprColonEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident))))))
              (expr
                (primary
                  (literal
                    (int_lit)))))
            (enumElement
              (symbol
                (ident))
              (pragma
                (exprColonEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident)))))))
            (enumElement
              (symbol
                (ident)))
            (enumElement
              (symbol
                (ident))
              (expr
                (primary
                  (literal
                    (int_lit))))))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (pragma
          (exprColonEqExpr
            (expr
              (primary
                (symbol
                  (ident))))))
        (primaryTypeDef
          (enumDecl
            (keyw)
            (enumElement
              (symbol
                (ident))
              (pragma
                (exprColonEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident))))))
              (expr
                (primary
                  (literal
                    (int_lit)))))
            (enumElement
              (symbol
                (ident))
              (pragma
                (exprColonEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident)))))))
            (enumElement
              (symbol
                (ident)))
            (enumElement
              (symbol
                (ident))
              (expr
                (primary
                  (literal
                    (int_lit)))))))))))

==================
primary keyword disambiguation
==================

bind a
discard bind a
static:
static a
var a
discard var a
ref a
ptr a
distinct a
out a
type a
type a = int

---

(module
  (stmt
    (bindStmt
      (keyw)
      (qualifiedIdent
        (symbol
          (ident)))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (primaryPrefix
            (keyw))
          (symbol
            (ident))))))
  (stmt
    (staticStmt
      (keyw)
      (block)))
  (stmt
    (exprStmt
      (primary
        (primaryPrefix
          (keyw))
        (symbol
          (ident)))))
  (stmt
    (declaration
      (variable
        (keyw)
        (declColonEquals
          (symbol
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (primaryPrefix
            (keyw))
          (symbol
            (ident))))))
  (stmt
    (exprStmt
      (primary
        (primaryPrefix
          (keyw))
        (symbol
          (ident)))))
  (stmt
    (exprStmt
      (primary
        (primaryPrefix
          (keyw))
        (symbol
          (ident)))))
  (stmt
    (exprStmt
      (primary
        (primaryPrefix
          (keyw))
        (symbol
          (ident)))))
  (stmt
    (exprStmt
      (primary
        (primaryPrefix
          (keyw))
        (symbol
          (ident)))))
  (stmt
    (exprStmt
      (primary
        (primaryPrefix
          (keyw))
        (symbol
          (ident)))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (symbol
            (ident)))))))

==================
conceptDecl
==================

type a = concept x
type b = concept x, var v, ref r, ptr p, static s, type T, out o
type c = concept x, var v{.deprecated.} 
type d = concept x, var v of RootObj
type e = concept x, var v{.deprecated.} of RootObj, RootRef
type f = concept x
  discard
  discard

---

(module
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (conceptDecl
            (keyw)
            (conceptParam
              (symbol
                (ident)))
            (block))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (conceptDecl
            (keyw)
            (conceptParam
              (symbol
                (ident)))
            (conceptParam
              (keyw)
              (symbol
                (ident)))
            (conceptParam
              (keyw)
              (symbol
                (ident)))
            (conceptParam
              (keyw)
              (symbol
                (ident)))
            (conceptParam
              (keyw)
              (symbol
                (ident)))
            (conceptParam
              (keyw)
              (symbol
                (ident)))
            (conceptParam
              (keyw)
              (symbol
                (ident)))
            (block))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (conceptDecl
            (keyw)
            (conceptParam
              (symbol
                (ident)))
            (conceptParam
              (keyw)
              (symbol
                (ident)))
            (pragma
              (exprColonEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))
            (block))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (conceptDecl
            (keyw)
            (conceptParam
              (symbol
                (ident)))
            (conceptParam
              (keyw)
              (symbol
                (ident)))
            (keyw)
            (typeDesc
              (primaryTypeDesc
                (symbol
                  (ident))))
            (block))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (conceptDecl
            (keyw)
            (conceptParam
              (symbol
                (ident)))
            (conceptParam
              (keyw)
              (symbol
                (ident)))
            (pragma
              (exprColonEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))
            (keyw)
            (typeDesc
              (primaryTypeDesc
                (symbol
                  (ident))))
            (typeDesc
              (primaryTypeDesc
                (symbol
                  (ident))))
            (block))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (conceptDecl
            (keyw)
            (conceptParam
              (symbol
                (ident)))
            (block
              (stmt
                (discardStmt
                  (keyw)))
              (stmt
                (discardStmt
                  (keyw))))))))))

==================
objectDecl simple
==================

type a = object 
type b = object of RootObj
type c{.deprecated.} = object 
  a: int
  z*: int
  c*, b*{.deprecated.}: int
  nil
  discard

---

(module
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (objectDecl
            (keyw))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (objectDecl
            (keyw)
            (keyw)
            (typeDesc
              (primaryTypeDesc
                (symbol
                  (ident)))))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (pragma
          (exprColonEqExpr
            (expr
              (primary
                (symbol
                  (ident))))))
        (primaryTypeDef
          (objectDecl
            (keyw)
            (objectPart
              (symbol
                (ident))
              (typeDesc
                (primaryTypeDesc
                  (symbol
                    (ident)))))
            (objectPart
              (symbol
                (ident))
              (opr)
              (typeDesc
                (primaryTypeDesc
                  (symbol
                    (ident)))))
            (objectPart
              (symbol
                (ident))
              (opr)
              (symbol
                (ident))
              (opr)
              (pragma
                (exprColonEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident))))))
              (typeDesc
                (primaryTypeDesc
                  (symbol
                    (ident)))))
            (objectPart
              (keyw))
            (objectPart
              (keyw))))))))

==================
objectWhen
==================

type a = object
  when true:
  a: int
type b = object
  when true: a: int
  elif false:
  a: float
  elif false:
    a: float
    b: float
  else:
    a: uint
type c = object
  when false: a: int
  elif false:
    a: float
  elif true:
  when false: 
    b: int
    c: int
  elif false: a: float
  else:
    b: uint

---

(module
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (objectDecl
            (keyw)
            (objectPart
              (objectWhen
                (keyw)
                (expr
                  (primary
                    (literal
                      (bool_lit))))
                (objectPart
                  (symbol
                    (ident))
                  (typeDesc
                    (primaryTypeDesc
                      (symbol
                        (ident))))))))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (objectDecl
            (keyw)
            (objectPart
              (objectWhen
                (keyw)
                (expr
                  (primary
                    (literal
                      (bool_lit))))
                (objectPart
                  (symbol
                    (ident))
                  (typeDesc
                    (primaryTypeDesc
                      (symbol
                        (ident)))))
                (objectElif
                  (keyw)
                  (expr
                    (primary
                      (literal
                        (bool_lit))))
                  (objectPart
                    (symbol
                      (ident))
                    (typeDesc
                      (primaryTypeDesc
                        (symbol
                          (ident))))))
                (objectElif
                  (keyw)
                  (expr
                    (primary
                      (literal
                        (bool_lit))))
                  (objectPart
                    (symbol
                      (ident))
                    (typeDesc
                      (primaryTypeDesc
                        (symbol
                          (ident)))))
                  (objectPart
                    (symbol
                      (ident))
                    (typeDesc
                      (primaryTypeDesc
                        (symbol
                          (ident))))))
                (objectElse
                  (keyw)
                  (objectPart
                    (symbol
                      (ident))
                    (typeDesc
                      (primaryTypeDesc
                        (symbol
                          (ident)))))))))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (objectDecl
            (keyw)
            (objectPart
              (objectWhen
                (keyw)
                (expr
                  (primary
                    (literal
                      (bool_lit))))
                (objectPart
                  (symbol
                    (ident))
                  (typeDesc
                    (primaryTypeDesc
                      (symbol
                        (ident)))))
                (objectElif
                  (keyw)
                  (expr
                    (primary
                      (literal
                        (bool_lit))))
                  (objectPart
                    (symbol
                      (ident))
                    (typeDesc
                      (primaryTypeDesc
                        (symbol
                          (ident))))))
                (objectElif
                  (keyw)
                  (expr
                    (primary
                      (literal
                        (bool_lit))))
                  (objectPart
                    (objectWhen
                      (keyw)
                      (expr
                        (primary
                          (literal
                            (bool_lit))))
                      (objectPart
                        (symbol
                          (ident))
                        (typeDesc
                          (primaryTypeDesc
                            (symbol
                              (ident)))))
                      (objectPart
                        (symbol
                          (ident))
                        (typeDesc
                          (primaryTypeDesc
                            (symbol
                              (ident)))))
                      (objectElif
                        (keyw)
                        (expr
                          (primary
                            (literal
                              (bool_lit))))
                        (objectPart
                          (symbol
                            (ident))
                          (typeDesc
                            (primaryTypeDesc
                              (symbol
                                (ident))))))
                      (objectElse
                        (keyw)
                        (objectPart
                          (symbol
                            (ident))
                          (typeDesc
                            (primaryTypeDesc
                              (symbol
                                (ident)))))))))))))))))

==================
objectCase
==================

type a = object
  case kind: uint8:
  of 0:
    a: int
  of 1:
    b: string
    c: string
  else:
    d: char
type b = object 
  case kind: bool:
  of true:
    a: int
  of false:
    b: float
type c = object
  case kind: uint8:
  of 0:
    a: int
    case kind2: bool:
      of true:
        x: int
      else:
        y: float
  of 1: b: string
  else:
    d: char

---

(module
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (objectDecl
            (keyw)
            (objectPart
              (objectCase
                (keyw)
                (symbol
                  (ident))
                (typeDesc
                  (primaryTypeDesc
                    (symbol
                      (ident))))
                (objectBranches
                  (objectBranch
                    (keyw)
                    (exprList
                      (expr
                        (primary
                          (literal
                            (int_lit)))))
                    (objectPart
                      (symbol
                        (ident))
                      (typeDesc
                        (primaryTypeDesc
                          (symbol
                            (ident))))))
                  (objectBranch
                    (keyw)
                    (exprList
                      (expr
                        (primary
                          (literal
                            (int_lit)))))
                    (objectPart
                      (symbol
                        (ident))
                      (typeDesc
                        (primaryTypeDesc
                          (symbol
                            (ident)))))
                    (objectPart
                      (symbol
                        (ident))
                      (typeDesc
                        (primaryTypeDesc
                          (symbol
                            (ident))))))
                  (objectElse
                    (keyw)
                    (objectPart
                      (symbol
                        (ident))
                      (typeDesc
                        (primaryTypeDesc
                          (symbol
                            (ident))))))))))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (objectDecl
            (keyw)
            (objectPart
              (objectCase
                (keyw)
                (symbol
                  (ident))
                (typeDesc
                  (primaryTypeDesc
                    (symbol
                      (ident))))
                (objectBranches
                  (objectBranch
                    (keyw)
                    (exprList
                      (expr
                        (primary
                          (literal
                            (bool_lit)))))
                    (objectPart
                      (symbol
                        (ident))
                      (typeDesc
                        (primaryTypeDesc
                          (symbol
                            (ident))))))
                  (objectBranch
                    (keyw)
                    (exprList
                      (expr
                        (primary
                          (literal
                            (bool_lit)))))
                    (objectPart
                      (symbol
                        (ident))
                      (typeDesc
                        (primaryTypeDesc
                          (symbol
                            (ident))))))))))))))
  (stmt
    (declaration
      (typeDef
        (keyw)
        (symbol
          (ident))
        (primaryTypeDef
          (objectDecl
            (keyw)
            (objectPart
              (objectCase
                (keyw)
                (symbol
                  (ident))
                (typeDesc
                  (primaryTypeDesc
                    (symbol
                      (ident))))
                (objectBranches
                  (objectBranch
                    (keyw)
                    (exprList
                      (expr
                        (primary
                          (literal
                            (int_lit)))))
                    (objectPart
                      (symbol
                        (ident))
                      (typeDesc
                        (primaryTypeDesc
                          (symbol
                            (ident)))))
                    (objectPart
                      (objectCase
                        (keyw)
                        (symbol
                          (ident))
                        (typeDesc
                          (primaryTypeDesc
                            (symbol
                              (ident))))
                        (objectBranches
                          (objectBranch
                            (keyw)
                            (exprList
                              (expr
                                (primary
                                  (literal
                                    (bool_lit)))))
                            (objectPart
                              (symbol
                                (ident))
                              (typeDesc
                                (primaryTypeDesc
                                  (symbol
                                    (ident))))))
                          (objectElse
                            (keyw)
                            (objectPart
                              (symbol
                                (ident))
                              (typeDesc
                                (primaryTypeDesc
                                  (symbol
                                    (ident))))))))))
                  (objectBranch
                    (keyw)
                    (exprList
                      (expr
                        (primary
                          (literal
                            (int_lit)))))
                    (objectPart
                      (symbol
                        (ident))
                      (typeDesc
                        (primaryTypeDesc
                          (symbol
                            (ident))))))
                  (objectElse
                    (keyw)
                    (objectPart
                      (symbol
                        (ident))
                      (typeDesc
                        (primaryTypeDesc
                          (symbol
                            (ident)))))))))))))))




