let rec print_il0 i =
match i.il0_t with
| IL0stmtLabel s -> s^":\n"
| IL0stmtDeclBulk( c, t, s, i ) ->
"\t"^(print_local_storage_class c)^" "^(print_c_type t)^"\t"^s
^(match i with
None -> ";\n"
| Some i -> " = "^(print_cttm_initializer i)^";\n")
| IL0stmtDeclAutoScalar( c, t, s, i ) ->
"\t"^(print_local_storage_class c)^" "^(print_c_type t)^"\t"^s
^(match i with
None -> ";\n"
| Some e -> " = "^(print_tempid e)^";\n")
| IL0stmtIf(IFNOT, e, s ) -> "\tif (! "^(print_tempid e)^" ) goto "^s^";\n"
| IL0stmtIf(IFTRUE, e, s ) -> "\tif ( "^(print_tempid e)^" ) goto "^s^";\n"
| IL0stmtSwitch( e, jump_table ) ->
let print = function
CASE n, s -> (string_of_big_int n)^"=>"^s
| DEFAULT, s -> "default=>"^s
in
"\tswitch ( "^(print_tempid e)^" ) {"^(print_list print "," jump_table)^"}\n"
| IL0stmtGoto s -> "\tgoto "^s^";\n"
| IL0stmtReturn None -> "\treturn;\n"
| IL0stmtReturn (Some e) -> "\treturn "^(print_tempid e)^";\n"
| IL0stmtDefTemp(id,typ,exp) ->
"\t" ^ print_tempid id ^ " : "^(print_c_type typ)^" := "^(print_il0expr exp)^";\n"
| IL0stmtReadToTemp(id,typ,lv,fs) ->
"\t" ^ print_tempid id ^ " : "^(print_c_type typ)^" := READ("^(print_il0lv lv fs)^");\n"
| IL0stmtWrite(lv,fs,id) ->
"\twrite(" ^ (print_il0lv lv fs) ^ " <- "^ print_tempid id ^");\n"
| IL0stmtSequence(l) ->
"\t<\n" ^ (String.concat "" (List.map print_il0 l)) ^ "\t>\n"
| IL0stmtParallel(l) ->
"\t[\n" ^ (String.concat "" (List.map print_il0 l)) ^ "\t]\n"