use unique_ptr for ast nodes