Skip to content
Snippets Groups Projects
idSolver.ml 4 KiB
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;
}

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 ; 
}


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_) =
  fun env id _lxm ->
    Hashtbl.find env.lenv_types (Lv6Id.of_idref false id)
let (lookup_node : local_env -> Lv6Id.idref -> Lxm.t -> Lic.node_key) =
  fun env id _lxm ->
    Hashtbl.find env.lenv_nodes (Lv6Id.of_idref false id)
let (lookup_const: local_env -> Lv6Id.idref -> Lxm.t -> Lic.const) =
  fun env id _lmx ->  
    Hashtbl.find env.lenv_const (Lv6Id.of_idref false id)
let (lookup_var: local_env -> Lv6Id.t -> Lxm.t -> Lic.var_info) = 
  fun env id _lmx ->
    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

let var_info_of_ident 
    (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