The grammar rules for types are:
type:: boolean | expr .. expr | { atom, ,atom } | array expr .. expr of type | atom ( expr, ,expr )
| expr .. expr
| { atom, ,atom }
| array expr .. expr of type
| atom ( expr, ,expr )