a simple AST ADT :p