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"