type alloc = Stack | Heap | GCHeap type primitive = CastP | AnyCastP | AssignP | MemP of string | AddrP | DerefP | AtP | NewP of alloc | PlacementNewP | NewArrayP of alloc | DeleteP | DestroyP | SizeofP | IncP | DecP | EqP | NeqP | ShiftLeftP | ShiftRightP | LessP | LessEqP | GreaterP | GreaterEqP | AddP | SubP | NegP | MultP | DivP | ModP | AndP | OrP | NotP let prim2str p = (match p with CastP -> "cast" | AnyCastP -> "any_cast" | AssignP -> "assign" | MemP n -> Printf.sprintf ".%s" n | AddrP -> "&" | DeleteP -> "delete" | DestroyP -> "destroy" | SizeofP -> "sizeof" | DerefP -> ".*" | AtP -> "[]" | NewP a -> "new" | PlacementNewP -> "new" | NewArrayP a -> "new array" | IncP -> "++" | DecP -> "--" | EqP -> "==" | NeqP -> "!=" | LessP -> "<" | LessEqP -> "<=" | GreaterP -> ">" | GreaterEqP -> ">=" | AddP -> "+" | SubP -> "-" | NegP -> "negate" | MultP -> "*" | DivP -> "/" | ModP -> "%" | ShiftLeftP -> "<<" | ShiftRightP -> ">>" | AndP -> "and" | OrP -> "or" | NotP -> "not") and alloc2str a = match a with Heap -> "heap" | GCHeap -> "gcheap" | Stack -> "stack"