Newer
Older
(* Time-stamp: <modified the 29/08/2019 (at 14:55) by Erwan Jahier> *)
(** Utilities for managing node environements (items tables) *)
type t = {
id2const : Lv6Id.idref -> Lxm.t -> Lic.const;
id2type : Lv6Id.idref -> Lxm.t -> Lic.type_;
id2node : Lv6Id.idref -> Lic.static_arg list -> Lxm.t -> Lic.node_exp;
id2var : Lv6Id.t -> Lxm.t -> Lic.var_info;
(*
global_symbols ->
- la table à résoudre les idents SANS pack
(i.e. toto au lieu de Titi::toto) dans un pack courant :
c'est lié au mécanisme du "uses"
- normallement, elle est "cachée" dans les fonctions id2const, id2type, id2node ...
Pourtant on mise ici quand meme !!
Visiblement, sert dans 3 trucs :
- AstTabSymbol.find_pack_of_const
- AstTabSymbol.find_pack_of_type
et
- Ast2lic.get_abstract_static_params
pour les 2 premiers : pas sur a quoi ca sert, a creuser ...
pour le 3eme ->
ca sert uniquement a trouver la "nature" attendue
des params statiques (type const ou node) necessaire pour
calculer les parms effectif (et donc la cle des noeud a compiler)
dans Ast2lic.of_node
Mais c'est un bug : impossible de trouver avec elle les
params statiques d'un noeud appele avec son nom complet (Titi::toto) !
Donc, c'est pas ça qui faut ...
Solution (pas hyper satisfaisante) :
- ajouter le AstTab global, qui permet de retrouver nímporte quelle
source ... pas bien dans l'esprit "abstraire" mais bon...
- revoir si le global_symbols est vraiment necessaire ?
*)
global_symbols : AstTabSymbol.t;
all_srcs : AstTab.t;
}
type local_env = {
lenv_node_key : Lic.node_key ;
(* lenv_globals : pack_env ; *)
lenv_types : (Lv6Id.t, Lic.type_) Hashtbl.t ;
lenv_const : (Lv6Id.t, Lic.const) Hashtbl.t ;
lenv_nodes : (Lv6Id.t, Lic.node_key) Hashtbl.t ;
lenv_vars : (Lv6Id.t, Lic.var_info) Hashtbl.t ;
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
}
let (make_local_env : Lic.node_key -> local_env) =
fun nk ->
let res =
{
lenv_node_key = nk;
lenv_types = Hashtbl.create 0;
lenv_const = Hashtbl.create 0;
lenv_nodes = Hashtbl.create 0;
lenv_vars = Hashtbl.create 0;
}
in
(* fill tables using static arg info *)
List.iter
(function
| Lic.ConstStaticArgLic(id,ce) -> Hashtbl.add res.lenv_const id ce
| Lic.TypeStaticArgLic(id,te) -> Hashtbl.add res.lenv_types id te
| Lic.NodeStaticArgLic(id, nk) -> Hashtbl.add res.lenv_nodes id nk
)
(snd nk);
res
let dump_local_env oc e =
let pt i t = Printf.fprintf oc "# type %s = %s\n" i (Lic.string_of_type t) in
Hashtbl.iter pt e.lenv_types;
let pc i t = Printf.fprintf oc "# const %s = %s\n" i (Lic.string_of_const t) in
Hashtbl.iter pc e.lenv_const;
(* let pn i (n,_,_) = Printf.fprintf oc "# node %s = %s\n" i (string_of_node_key n) in *)
let pn i nk = Printf.fprintf oc "# node %s = %s\n" i (Lic.string_of_node_key nk) in
Hashtbl.iter pn e.lenv_nodes;
(* Grouping those 2 ones is sometimes useful *)
type node_env = {
local : local_env;
global: t;
}
let (lookup_type: local_env -> Lv6Id.idref -> Lxm.t -> Lic.type_) =
Hashtbl.find env.lenv_types (Lv6Id.of_idref false id)
let (lookup_node : local_env -> Lv6Id.idref -> Lxm.t -> Lic.node_key) =
Hashtbl.find env.lenv_nodes (Lv6Id.of_idref false id)
let (lookup_const: local_env -> Lv6Id.idref -> Lxm.t -> Lic.const) =
Hashtbl.find env.lenv_const (Lv6Id.of_idref false id)
let (lookup_var: local_env -> Lv6Id.t -> Lxm.t -> Lic.var_info) =
Hashtbl.find env.lenv_vars id
let node_exp_of_node_key
(id_solver: t) (node_key: Lic.node_key) (lxm : Lxm.t)
: Lic.node_exp =
let (id, sargs) = node_key in
id_solver.id2node (Lv6Id.idref_of_long id) sargs lxm
(id_solver: t) (id: Lv6Id.t) (lxm : Lxm.t)
: Lic.var_info =
id_solver.id2var id lxm
let const_eff_of_item_key
(id_solver: t) (id: Lic.item_key) (lxm : Lxm.t)
: Lic.const =
id_solver.id2const (Lv6Id.idref_of_long id) lxm