t_atom() = #t_atom{a=list(), val=atom()}
t_binary() = #t_binary{a=list(), base_size=integer(), unit_size=integer()}
t_def() = #t_def{name=t_type() | t_var(), type=type()}
t_field() = #t_field{a=list(), name=type(), type=type()}
t_float() = #t_float{a=list(), val=float()}
t_fun() = #t_fun{a=list(), args=[type()], range=type()}
t_integer() = #t_integer{a=list(), val=integer()}
t_integer_range() = #t_integer_range{a=list(), from=integer(), to=integer()}
t_list() = #t_list{a=list(), type=type()}
t_name() = #t_name{app=[] | atom(), module=[] | atom(), name=[] | atom()}
t_nil() = #t_nil{a=list()}
t_nonempty_list() = #t_nonempty_list{a=list(), type=type()}
t_paren() = #t_paren{a=list(), type=type()}
t_record() = #t_list{a=list(), name=t_atom(), fields=[field()]}
t_spec() = #t_spec{name=t_name(), type=t_type(), defs=[t_def()]}
t_throws() = #t_throws{type=type(), defs=[t_def()]}
t_tuple() = #t_tuple{a=list(), types=[type()]}
t_type() = #t_type{a=list(), name=t_name(), args=[type()]}
t_typedef() = #t_typedef{name=t_name(), args=[type()], type=type() | undefined, defs=[t_def()]}
t_union() = #t_union{a=list(), types=[type()]}
t_var() = #t_var{a=list(), name=[] | atom()}
type() = t_atom() | t_binary() | t_float() | t_fun() | t_integer() | t_integer_range() | t_list() | t_nil() | t_nonempty_list() | t_record() | t_tuple() | t_type() | t_union() | t_var() | t_paren()