Newer
Older
(* Time-stamp: <modified the 26/02/2015 (at 13:46) by Erwan Jahier> *)
(** Static evaluation of constants. *)
(** 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 "IdSolver.t", qui contient deux fonctions :
id2const : Lv6Id.idref -> Lxm.t -> const_eff
id2type : Lv6Id.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 : IdSolver.t -> AstCore.val_exp -> Lic.const list
(**
Rôle : calcule une taille de tableau
Entrées:
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 : IdSolver.t -> AstCore.val_exp -> int
(**
Rôle :
int (entre 0 et taille du tableau -1)
val eval_array_index : IdSolver.t -> AstCore.val_exp -> 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
*)
val eval_array_slice :
IdSolver.t -> AstCore.slice_info -> Lxm.t -> Lic.slice_info