Newer
Older
(** Time-stamp: <modified the 29/08/2008 (at 10:21) by Erwan Jahier> *)
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)
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
(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
(vexp : val_exp)
-> int
(N.B. ne renvoie que des taille correctes : > 0)
eval_array_index
(vexp : val_exp)
(sz : int)
-> int
(N.B. on doit préciser la taille sz du tableau)
eval_array_slice
(lxm : Lxm.t)
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
val f : Eff.id_solver -> SyntaxTreeCore.val_exp -> Eff.const list
(**
Rôle : calcule une taille de tableau
Entrées:
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 :
Effets de bord :
val eval_array_index : Eff.id_solver -> SyntaxTreeCore.val_exp ->
int -> Lxm.t -> int
(**
Rôle :
id_solver, slice_info, size du tableau,
lxm (source de l'opération slice pour warning)
(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 :
*)
val eval_array_slice :
Eff.id_solver -> SyntaxTreeCore.slice_info -> int -> Lxm.t ->
Eff.slice_info