cleaned up abstract syntax