let rec print_il1 expr = match expr.il1_t with
| IL1stmtDeclAutoScalar( c, t, s, i ) ->
"\tDECL_SCALAR "^(print_local_storage_class c)^" "^(print_c_type t)^"\t"^s
^(match i with
None -> ";\n"
| Some i -> " = "^(print_tempid i)^";\n")
| IL1stmtDeclBulk( c, t, s, i ) ->
"\tDECL_BULK "^(print_local_storage_class c)^" "^(print_c_type t)^"\t"^s
^(match i with
None -> ";\n"
| Some i -> " = "^(print_cttm_initializer i)^";\n")
| IL1stmtIf( f, e, n ) ->
"\tif ("^
(if f = IFNOT then "! " else "")^
(print_tempid e)^" ) goto "^(string_of_int n)^";\n"
| IL1stmtSwitch( e, jump_table ) ->
let print = function
CASE c, n -> (string_of_big_int c)^"=>"^(string_of_int n)
| DEFAULT, n -> "default=>"^(string_of_int n)
in
"\tswitch ( "^(print_tempid e)^" ) {"^(print_list print "," jump_table)^"}\n"
| IL1stmtGoto s -> "\tgoto "^(string_of_int s)^";\n"
| IL1stmtReturn None -> "\treturn;\n"
| IL1stmtReturn (Some e) -> "\treturn "^(print_tempid e)^";\n"
| IL1stmtDefTemp(id,typ,exp) ->
"\t" ^ print_tempid id ^ " : "^(print_c_type typ)^" := "^(print_il0expr exp)^";\n"
| IL1stmtReadToTemp(id,typ,lv,fs) ->
"\t" ^ print_tempid id ^ " : "^(print_c_type typ)^" := READ("^(print_il0lv lv fs)^");\n"
| IL1stmtWrite(lv,fs,id) ->
"\twrite(" ^ (print_il0lv lv fs) ^ " <- "^ print_tempid id ^");\n"
| IL1stmtSequence(l) ->
"\t<\n" ^ (String.concat "" (List.map print_il1 l)) ^ "\t>\n"
| IL1stmtParallel(l) ->
"\t[\n" ^ (String.concat "" (List.map print_il1 l)) ^ "\t]\n"