123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374(*-----------------------------------------------------------------------
* Copyright (C) - Verimag.
** This file may only be copied under the terms of the CeCill
** Public License
**-----------------------------------------------------------------------
**
** File: var.mli
** Author: erwan.jahier@univ-grenoble-alpes.fr
*)typename=stringtypemode=Input|Output|Local|Pre(*
module NameMap = struct
include Map.Make(
struct
type t = name
let compare = compare
end
)
end
module Name2Val = struct
type t = Value.t NameMap.t
let empty:t = NameMap.empty
let get (n2v:t) (n:name) = NameMap.find n n2v
let add (n2v:t) ((n,v):name * Value.t) = NameMap.add n v n2v
let add_list (n2v:t) (l:(name * Value.t) list) = List.fold_left add n2v l
let from_list (l:(name * Value.t) list) = List.fold_left add empty l
let union (x1:t) (x2:t) = NameMap.fold (fun n v x -> add x (n,v)) x1 x2
let support (x:t) = NameMap.fold (fun n v acc -> n::acc) x []
let partition f (x:t) = NameMap.fold
(fun n v (yes, no) -> if f (n,v) then (add yes (n,v), no) else (yes, add no (n,v))) x (empty,empty)
let content (x:t) = (
List.fast_sort (fun (vn1, _) (vn2, _) -> compare vn1 vn2)
(NameMap.fold (fun n v acc -> (n,v)::acc) x [])
)
let to_string (pfx:string) (x:t) = (
if x = empty then pfx^"empty\n"
else (
let nv2s (n,v) = pfx ^ "\t" ^ (Prevar.format n) ^ " = " ^ (Value.to_string v) ^ "\n" in
let str_l = List.map nv2s (content x) in
String.concat "" str_l
)
)
let print (x:t) (oc:out_channel) = output_string oc (to_string "" x)
let mapi = NameMap.mapi
let iter = NameMap.iter
end
*)typevnt=name*Type.ttypesubst=(name*Value.t)typenum_subst=(name*Value.num)(* type env_in = (name, Value.t) Hashtbl.t *)typeenv=Value.OfIdent.ttypeenv_in=Value.OfIdent.ttypeenv_out=Value.OfIdent.ttypeenv_loc=Value.OfIdent.tlet(sort_list_string_pair:(string*'a)list->(string*'a)list)=funvar_list->List.sort(fun(vn1,_t1)(vn2,_t2)->comparevn1vn2)var_listlet(subst_list_to_string:string->substlist->string)=funprefixsl->letstr_l=List.map(fun(vn,e)->prefix^"\t"^(Prevar.formatvn)^" = "^(Value.to_stringe)^"\n")(sort_list_string_pairsl)inString.concat""str_llet(print_subst_list:substlist->out_channel->unit)=funsloc->output_stringoc(subst_list_to_string""sl)(* let (print_env_out : env_out -> out_channel -> unit) = print_subst_list *)(* let (print_env_loc : env_loc -> out_channel -> unit) = print_subst_list *)let(print_env_out:env_out->out_channel->unit)=Value.OfIdent.printlet(print_env_loc:env_out->out_channel->unit)=Value.OfIdent.printlet(print_env_in:env_in->out_channel->unit)=Value.OfIdent.print(* OBSOLETE
let (print_env_in : env_in -> out_channel -> unit) =
fun tbl oc ->
Hashtbl.iter
(fun vn e ->
output_string oc (Prevar.format vn) ;
output_string oc " = ";
Value.print oc e;
output_string oc "\n\t"
)
tbl
*)let(get_val_env_in:env_in->name->Value.t)=funenvn->(* try Hashtbl.find env n *)tryValue.OfIdent.getenvnwithNot_found->(* I should rather raise a specific exception *)print_string("Error: a (Lutin program) input is missing: "^n^"\n"^"E: Maybe this program is not bootable (able to start without input)\n"^"E: and used as an environment of Lurette or rdbg?\n");flushstdout;exit2(* OBSOLETE ?
let (inputs_to_list : env_in -> subst list) =
fun inputs ->
Hashtbl.fold
(fun name value acc -> (name, value)::acc)
inputs
[]
*)(* let (get_val_env_out : env_out -> name -> Value.t) = fun l n -> List.assoc n l *)let(get_val_env_out:env_out->name->Value.t)=Value.OfIdent.get(* let (get_val_env_loc : env_loc -> name -> Value.t) = fun l n -> List.assoc n l *)let(get_val_env_loc:env_loc->name->Value.t)=Value.OfIdent.get(* let (init_env_out : unit -> env_out) = fun _ -> [] *)(* let (init_env_loc : unit -> env_loc) = fun _ -> [] *)let(init_env_out:unit->env_out)=fun_->Value.OfIdent.emptylet(init_env_loc:unit->env_loc)=fun_->Value.OfIdent.emptylet(init_env_in:unit->env_in)=fun_->Value.OfIdent.emptytype'at={index:int;n:name;t:Type.t;mode:mode;alias:'aoption;min:'aoption;max:'aoption;default:'aoption;init:'aoption}let(name:'at->name)=funvar->var.nlet(typ:'at->Type.t)=funvar->var.tlet(mode:'at->mode)=funvar->var.modelet(min:'at->'aoption)=funvar->var.minlet(max:'at->'aoption)=funvar->var.maxlet(alias:'at->'aoption)=funvar->var.aliaslet(default:'at->'aoption)=funvar->var.defaultlet(init:'at->'aoption)=funvar->var.initlet(index:'at->int)=funvar->var.index(* global counter that is incremented each time a variable is created *)letvar_cpt=ref0(* exported *)let(make:string->string->Type.t->mode->'at)=funlv_prefntm->(* let _ = print_string (n^"\n") ; flush stdout in *)letn'=ifm<>Localthennelse(* Rename non-local vars to avoid clashes *)letl=String.lengthlv_prefandln=String.lengthninifln<l||(String.subn0l)<>lv_prefthen(lv_pref^n)elseninletidx=!var_cptin(* print_string ("variable " ^ n' ^ " -> " ^ (string_of_int idx) ^ "\n"); *)(* flush stdout; *)incrvar_cpt;{n=n';t=t;mode=m;alias=None;min=None;max=None;default=None;init=None;index=idx}let(change_type:'at->Type.t->'at)=funvart->{n=var.n;t=t;mode=var.mode;alias=var.alias;min=var.min;max=var.max;default=var.default;init=var.init;index=var.index}let(set_min:'at->'a->'at)=funvarmin->{n=var.n;t=var.t;mode=var.mode;alias=var.alias;min=Somemin;max=var.max;default=var.default;init=var.init;index=var.index}let(set_max:'at->'a->'at)=funvarmax->{n=var.n;t=var.t;mode=var.mode;alias=var.alias;min=var.min;max=Somemax;default=var.default;init=var.init;index=var.index}let(set_alias:'at->'a->'at)=funvaralias->{n=var.n;t=var.t;mode=var.mode;alias=Somealias;min=var.min;max=var.max;default=var.default;init=var.init;index=var.index}let(set_default:'at->'a->'at)=funvardefault->{n=var.n;t=var.t;mode=var.mode;alias=var.alias;min=var.min;max=var.max;default=Somedefault;init=var.init;index=var.index}let(set_init:'at->'a->'at)=funvarinit->{n=var.n;t=var.t;mode=var.mode;alias=var.alias;min=var.min;max=var.max;default=var.default;init=Someinit;index=var.index}let(make_pre:'at->'at)=funvar->letpre_str=Prevar.give_pre_var_namevar.ninletpv=make""pre_strvar.tPreinmatchvar.initwithNone->pv|Somei->set_initpvilet(mode_of_string:string->mode)=funstr->matchstrwith"inputs"->Input|"outputs"->Output|"locals"->Local|_->assertfalselet(mode_to_string:mode->string)=funm->matchmwithInput->"input"|Output->"output"|Local->"local"|Pre->"pre"let(_print_format:'at->unit)=funvar->Format.print_string(var.n^":"^(Type.to_stringvar.t)^":"^(mode_to_stringvar.mode)^" min="^(ifvar.min=Nonethen"None"else"Some ...")^" max="^(ifvar.max=Nonethen"None"else"Some ...")^(* " \n\talias=" ^ *)(* (if var.alias = None then "None" else "Some ...") ^ " \n\tdefault=" ^ *)(* (if var.default = None then "None" else "Some ...") ^ " \n\tinit=" ^ *)(* (if var.init = None then "None" else "Some ...") *)"\n")let(to_string:'at->string)=funvar->(var.n^":"^(Type.to_stringvar.t)^":"^(mode_to_stringvar.mode)^" min="^(ifvar.min=Nonethen"None"else"Some ...")^" max="^(ifvar.max=Nonethen"None"else"Some ...")^" alias="^(ifvar.alias=Nonethen"None"else"Some ...")^" default="^(ifvar.default=Nonethen"None"else"Some ...")^" init="^(ifvar.init=Nonethen"None"else"Some ...")^" index="^(string_of_intvar.index)^"\n")let(to_string_verbose:('a->string)->'at->string)=funconvertvar->(var.n^":"^(Type.to_stringvar.t)^":"^(mode_to_stringvar.mode)^" min="^(matchvar.minwithNone->"None"|Somex->(convertx))^" max="^(matchvar.maxwithNone->"None"|Somex->(convertx))^" alias="^(matchvar.aliaswithNone->"None"|Somex->(convertx))^" default="^(matchvar.defaultwithNone->"None"|Somex->(convertx))^" init="^(matchvar.initwithNone->"None"|Somex->(convertx))^" index="^(string_of_intvar.index))(* "\n") *)let(print:'at->unit)=funvar->print_string(to_stringvar)let(is_newer:'at->'at->int)=funvar1var2->var1.index-var2.index