open CompiledData open Printf open Lxm let (long : Ident.long -> string) = fun id -> let str = Ident.string_of_long id in Str.global_replace (Str.regexp "::") "__" str let rec string_of_const_eff = ( function | Bool_const_eff true -> "true" | Bool_const_eff false -> "false" | Int_const_eff i -> sprintf "%d" i | Real_const_eff r -> sprintf "%f" r | Extern_const_eff (s,t) -> (long s) | Enum_const_eff (s,t) -> (long s) | Struct_const_eff (fl, t) -> ( let string_of_field = function (id, veff) -> (Ident.to_string id)^" = "^(string_of_const_eff veff) in let flst = List.map string_of_field fl in (string_of_type_eff t)^"{"^(String.concat "; " flst)^"}" ) | Array_const_eff (ctab, t) -> ( let vl = Array.to_list(Array.map string_of_const_eff ctab) in "["^(String.concat ", " vl)^"]" ) ) and string_of_type_eff = function | Bool_type_eff -> "bool" | Int_type_eff -> "int" | Real_type_eff -> "real" | External_type_eff i -> long i | Enum_type_eff (i, sl) -> assert (sl <>[]); let f sep acc s = acc ^ sep ^ (long s) in (List.fold_left (f ", ") (f "" "enum {" (List.hd sl)) (List.tl sl)) ^ "}" | Array_type_eff (ty, sz) -> sprintf "%s^%d" (string_of_type_eff ty) sz | Struct_type_eff (i, fl) -> assert (fl <>[]); let f sep acc (id, (type_eff, const_eff_opt)) = acc ^ sep ^ (Ident.to_string id) ^ " : " ^ (string_of_type_eff type_eff) ^ match const_eff_opt with None -> "" | Some ce -> " (" ^ (string_of_const_eff ce) ^ ")" in (List.fold_left (f "; ") (f "" " {" (List.hd fl)) (List.tl fl)) ^ "}" and string_of_type_eff_list = function | [] -> "" | [x] -> string_of_type_eff x | l -> String.concat " * " (List.map string_of_type_eff l) let rec string_of_node_key (nkey: node_key) = ( let arg2string (sa : static_arg_eff) = match sa with | ConstStaticArgEff (id, ceff) -> sprintf "const %s" (string_of_const_eff ceff) | TypeStaticArgEff (id, teff) -> sprintf "type %s" (string_of_type_eff teff) | NodeStaticArgEff (id, opeff) -> sprintf "node %s" (string_of_node_key opeff.node_key_eff) in match nkey with | (ik, []) -> long ik | (ik, salst) -> let astrings = List.map arg2string salst in sprintf "%s<<%s>>" (long ik) (String.concat ", " astrings) ) let (string_of_var_info_eff: var_info_eff -> string) = fun x -> (Ident.to_string x.var_name_eff) ^ ":"^(string_of_type_eff x.var_type_eff) let string_of_decl (id,teff) = (Ident.to_string id) ^ ":" ^ (string_of_type_eff teff) let (string_of_type_decl_list : (Ident.t * type_eff) list -> string -> string) = fun tel sep -> let str = String.concat sep (List.map string_of_decl tel) in str let string_of_slice_info_eff si_eff = "[" ^ (string_of_int si_eff.se_first) ^ ".." ^ (string_of_int si_eff.se_last) ^ (if si_eff.se_step = 1 then "" else " step " ^ (string_of_int si_eff.se_step)) ^ "]" let rec (string_of_leff : left_eff -> string) = function | LeftVarEff (vi_eff,_) -> Ident.to_string vi_eff.var_name_eff | LeftFieldEff(leff,id,_) -> (string_of_leff leff) ^ "." | LeftArrayEff(leff,i,_) -> (string_of_leff leff) ^ "[" ^ (string_of_int i) ^ "]" | LeftSliceEff(leff,si,_) -> (string_of_leff leff) ^ (string_of_slice_info_eff si) let (string_of_leff_list : left_eff list -> string) = fun l -> (if List.length l = 1 then "" else "(") ^ (String.concat ", " (List.map string_of_leff l)) ^ (if List.length l = 1 then "" else ")") let rec (string_of_by_pos_op_eff : by_pos_op_eff -> val_exp_eff list -> string) = fun posop vel -> let tuple vel = if vel = [] then "" else "(" ^ (String.concat ", " (List.map string_of_val_exp_eff vel)) ^ ")" in let tuple_square vel = if vel = [] then "" else "[" ^ (String.concat ", " (List.map string_of_val_exp_eff vel)) ^ "]" in match posop,vel with | Predef_eff Predef.IF_n, [ve1; ve2; ve3] -> " if (" ^ (string_of_val_exp_eff ve1) ^ ") then (" ^ (string_of_val_exp_eff ve2) ^ ") else (" ^ (string_of_val_exp_eff ve3) ^ ")" | Predef_eff op, [ve1; ve2] -> if Predef.is_infix op then ("("^ (string_of_val_exp_eff ve1) ^ " " ^ (Predef.op2string op) ^ " " ^ (string_of_val_exp_eff ve2) ^ ")" ) else ( (Predef.op2string op) ^ (tuple vel) ) | Predef_eff op, _ -> (Predef.op2string op) ^ (tuple vel) | CALL_eff nee, _ -> ( string_of_node_key nee.it.node_key_eff) ^ (tuple vel) | IDENT_eff idref, _ -> Ident.string_of_idref idref | PRE_eff, _ -> "pre" ^ (tuple vel) | ARROW_eff, [ve1; ve2] -> (string_of_val_exp_eff ve1) ^ " -> " ^ (string_of_val_exp_eff ve2) | FBY_eff, [ve1; ve2] -> (string_of_val_exp_eff ve1) ^ " fby " ^ (string_of_val_exp_eff ve2) | WHEN_eff, [ve1; ve2] -> (string_of_val_exp_eff ve1) ^ " when " ^ (string_of_val_exp_eff ve2) | CURRENT_eff,_ -> "current " ^ (tuple vel) | TUPLE_eff,_ -> (tuple vel) | WITH_eff,_ -> "with " ^ (tuple vel) | CONCAT_eff, [ve1; ve2] -> (string_of_val_exp_eff ve1) ^ " | " ^ (string_of_val_exp_eff ve2) | HAT_eff (i, teff), _ -> (string_of_type_eff teff) ^ "^" ^ (string_of_int i) | ARRAY_eff, _ -> tuple_square vel | STRUCT_ACCESS_eff(id), [ve1] -> (string_of_val_exp_eff ve1) ^ "." ^ (Ident.to_string id) | ARRAY_ACCES_eff(i, type_eff), [ve1] -> (string_of_val_exp_eff ve1) ^ "[" ^ (string_of_int i) ^ "]" | ARRAY_SLICE_eff(si_eff, type_eff), [ve1] -> (string_of_val_exp_eff ve1) ^ (string_of_slice_info_eff si_eff) | ARRAY_SLICE_eff(_,_), _ -> assert false (* todo *) | MERGE_eff _, _ -> assert false (* todo *) | ITERATOR_eff _, _ -> assert false (* todo *) (* Cannot happen *) | WHEN_eff, _ -> assert false | ARROW_eff, _ -> assert false | FBY_eff, _ -> assert false | CONCAT_eff, _ -> assert false | STRUCT_ACCESS_eff(_), _ -> assert false | ARRAY_ACCES_eff(i, type_eff), _ -> assert false and string_of_val_exp_eff = function | CallByPosEff (by_pos_op_eff, OperEff vel) -> (string_of_by_pos_op_eff by_pos_op_eff.it vel) | CallByNameEff(by_name_op_eff, l) -> "xxx todo " let wrap_long_line str = if String.length str < 75 then str else let str_list = Str.split (Str.regexp " ") str in let new_str, reste = List.fold_left (fun (accl, acc_str) str -> let new_acc_str = acc_str ^ " " ^ str in if String.length new_acc_str > 75 then (accl ^ acc_str ^ "\n\t" , str) else (accl, new_acc_str) ) ("","") str_list in new_str ^ " " ^ reste let string_of_eq_info_eff (leff_list, vee) = wrap_long_line ( (string_of_leff_list leff_list) ^ " = " ^ (string_of_val_exp_eff vee) ^ ";") let (string_of_assert : val_exp_eff srcflagged -> string ) = fun eq_eff -> wrap_long_line ( "assert(" ^ string_of_val_exp_eff eq_eff.it ^ ");") let (string_of_eq : eq_info_eff srcflagged -> string) = fun eq_eff -> string_of_eq_info_eff eq_eff.it let wrap_long_profile str = if String.length str < 75 then str else "\n"^( Str.global_replace (Str.regexp "returns") "\nreturns" (Str.global_replace (Str.regexp "(") "(\n\t" (Str.global_replace (Str.regexp "; ") ";\n\t" str))) let (profile_of_node_exp_eff: node_exp_eff -> string) = fun neff -> wrap_long_profile ((if neff.def_eff = ExternEff then "extern " else "") ^ (if neff.has_mem_eff then "node " else "function ") ^ (string_of_node_key neff.node_key_eff) ^ "(" ^ (string_of_type_decl_list neff.inlist_eff "; ") ^ ") returns (" ^ (string_of_type_decl_list neff.outlist_eff"; ") ^ ");\n") let (string_of_node_def : node_def_eff -> string list) = function | ExternEff | AbstractEff -> [] | BodyEff node_body_eff -> List.append (List.map string_of_assert node_body_eff.asserts_eff) (List.map string_of_eq node_body_eff.eqs_eff) let (type_decl: Ident.long -> type_eff -> string) = fun tname teff -> "type " ^ (long tname) ^ (match teff with | External_type_eff _ -> ";\n" | _ -> " = " ^ (string_of_type_eff teff) ^ ";\n" ) let (const_decl: Ident.long -> const_eff -> string) = fun tname ceff -> "const " ^ (long tname) ^ (match ceff with | Extern_const_eff _ -> "" | _ -> " = " ^ (string_of_const_eff ceff) ) ^ ":" ^ (string_of_type_eff (type_of_const_eff ceff)) ^ ";\n" let (node_of_node_exp_eff: node_exp_eff -> string) = fun neff -> (profile_of_node_exp_eff neff) ^ (match neff.def_eff with | ExternEff -> "" | AbstractEff -> "" | BodyEff _ -> ((match neff.loclist_eff with None -> "" | Some [] -> "" | Some l -> "var\n " ^ (string_of_type_decl_list l ";\n ") ^ ";\n") ^ "let\n " ^ (String.concat "\n " (string_of_node_def neff.def_eff)) ^ "\ntel\n-- end of node " ^ (string_of_node_key neff.node_key_eff) ^ "\n" ) ) let string_of_clock (ck : clock_eff) = ( match ck with BaseClockEff -> "<base>" | VarClockEff veff -> (Ident.to_string veff.var_name_eff) ) (*--------------------------------------------------------------------- Formatage standard des erreurs de compil ----------------------------------------------------------------------*) let node_error_string nkey = ( Printf.sprintf "While checking %s" (string_of_node_key nkey) ) (*--------------------------------------------------------------------- Message d'erreur (associ� � un lexeme) sur stderr ----------------------------------------------------------------------*) let print_compile_node_error nkey lxm msg = ( Printf.eprintf "%s\n" (node_error_string nkey); Errors.print_compile_error lxm msg ; flush stderr ) let print_global_node_error nkey msg = ( Printf.eprintf "%s\n" (node_error_string nkey); Errors.print_global_error msg ; flush stderr )