+ | pp_stm Nop = ";"
+ | pp_stm Break = "break;"
+ | pp_stm Continue = "continue;"
+ | pp_stm (If (e, s, NONE)) = "if ("^pp_exp e^")"^pp_block s
+ | pp_stm (If (e, s, SOME s2)) = "if ("^pp_exp e^")"^pp_block s^" else "^pp_block s2
+ | pp_stm (While (e, s)) = "while ("^pp_exp e^") "^pp_block s
+ | pp_stm (For (so1, e, so2, s)) = "for ("^ (if (isSome so1) then pp_stm (valOf so1) else "") ^ pp_exp e ^ (if(isSome so2) then pp_stm (valOf so2) else "") ^ ")" ^ pp_block s
+ | pp_stm (MarkedStm m) = pp_stm (Mark.data m)
+
+ and pp_block (nil) = ";"
+ | pp_block (a::nil) = pp_stm a
+ | pp_block (l) = let
+ val contents = map pp_stm l
+ in
+ "{" ^ String.concat contents ^ "}"
+ end