type arithmetic_command = | Add | Sub | Neg | Eq | Gt | Lt | And | Or | Not type memory_segment = | Argument | Local | Static | Constant | This | That | Pointer | Temp type memory_command = | Push | Pop type branching_command = | Label | Goto | Ifgoto type function_command = | Function | Call type expr = | ArithmeticCommand of arithmetic_command | MemoryAccessCommand of memory_command * memory_segment * int | ProgramFlowCommand of branching_command * string | FunctionCallCommand of function_command * string * int | Return