(** Time-stamp: <modified the 29/08/2008 (at 10:21) by Erwan Jahier> *) (* DESCRIPTION : Evaluation statique des expressions "r�put�es" constantes (defs de constantes, tailles de tableaux, indices et step des arrays). PARAMETRES : Pour avoir qq chose de g�n�rique, les fonctions sont param�tr�es par un "Eff.id_solver", qui contient deux fonctions : (voir Eff) type Eff.id_solver = { id2const : Ident.idref -> Lxm.t -> const_eff id2type : Ident.idref -> Lxm.t -> const_eff } (N.B. on passe le lexeme pour d�ventuels messages d'erreurs) FONCTION PRINCIPALE : Elle l�ve "Compile_error lxm msg" en cas d'erreur. eval_const (env : Eff.id_solver) (vexp : val_exp) -> const_eff list (N.B. dans le cas g�n�ral, une val_exp peut d�noter un tuple, on rend donc bien une liste de constante) FONCTIONS DERIVEES : (permet de pr�ciser les messages d'erreur) Elles l�vent "EvalArray_error msg" en cas d'erreur, se qui permet de r�cup�rer l'erreur. eval_array_size (env : Eff.id_solver) (vexp : val_exp) -> int (N.B. ne renvoie que des taille correctes : > 0) eval_array_index (env : Eff.id_solver) (vexp : val_exp) (sz : int) -> int (N.B. on doit pr�ciser la taille sz du tableau) eval_array_slice (env : Eff.id_solver) (sl : slice_info srcflagged) (sz : int) (lxm : Lxm.t) -> slice_eff N.B. slice_info_eff = {first: int; last: int; step: int; width: int} N.B. on doit passer le lexeme de l'op�ration � cause d'�ventuels warnings *) exception EvalArray_error of string val f : Eff.id_solver -> SyntaxTreeCore.val_exp -> Eff.const list (** R�le : calcule une taille de tableau Entr�es: Sorties : int (strictement positif) Effets de bord : EvalArray_error "bad array size, type int expected but get <t>" si t pas int EvalArray_error "bad array size <n>" si n <= 0 *) val eval_array_size : Eff.id_solver -> SyntaxTreeCore.val_exp -> int (** R�le : Entr�es : id_solver, val_exp, taille du tableau Sorties : int (entre 0 et taille du tableau -1 Effets de bord : EvalArray_error msg si pas bon *) val eval_array_index : Eff.id_solver -> SyntaxTreeCore.val_exp -> int -> Lxm.t -> int (** R�le : Entr�es : id_solver, slice_info, size du tableau, lxm (source de l'op�ration slice pour warning) Sorties : slice_info_eff, i.e. (fisrt,last,step,width) tels que step <> 0 et - si step > 0 alors 0<=first<=last et first<=sz - si step < 0 alors 0<=last<=first et first<=sz - 1<=width<=sz Effets de bord : EvalArray_error msg si pas bon *) val eval_array_slice : Eff.id_solver -> SyntaxTreeCore.slice_info -> int -> Lxm.t -> Eff.slice_info