Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file coIdent.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132(**----------------------------------------------------------
COMPILATION/EXPANSION
------------------------------------------------------------
Identificateurs et remontée au source
DOIT ETRE REMIS A ZERO entre 2 utilisations
Au niveau des identificateurs, il faut distinguer :
- les idents source (type [[Syntaxe.ident]], donc parfaitement
identifiés au niveau source,
- les idents target qui sont des chaînes uniques par construction.
Principe de la pile de remontée :
- Tout ident apparait dans le E1 d'un "let f = E1 in E2",
(ou d'un let f = E1, ou d'un node n ... = E1)
- Cette référence est identifiée par son lexeme, plus
le lexeme qui correspond à la déclaration du f
- Dans le cas de l'expansion, ce f est traité car on
est tombé au préalable sur une référence à f, dans un
autre contexte, etc.
----------------------------------------------------------*)(**********************************************************)openPrintf(** Ident unique dans le target *)typet=stringletto_stringtid=tidletlist_to_stringtidl_sep=String.concat","tidlletfrom_strings=s(** L'unicité des ident target est garantie par un numérotage *)typespace=intrefletnew_space()=(let_idcpt=ref0in_idcpt)letget_fresh_idcptpfx=(incr_idcpt;sprintf"_%s%03d"pfx!_idcpt)letgets=((* XXX migth clash! (in the user name one of its I/O variable "_X001" for instance)
The correct code would be :
sprintf "_%s" s
but it confuses the current version of lurette *)sprintf"%s"s)letof_cpti=sprintf"cpt%02d"i(** Avec l'expansion, la remontée au source se fait par une "pile" de
couples (lexeme de la ref, lexeme du contexte), le contexte étant
toujours une déclaration de macro (ou de noeud pour le
top-level). La val_exp (correspondant au lexeme de la ref) sert
pour ldbg.
*)typesrc_stack=(Lexeme.t*Lexeme.t*Syntaxe.val_expoption)list(** Au cours de la construction, on a besoin de désigner le contexte
uniquement, d'où le type suivant qui comprend le lexeme
de la déclaration du scope (let ou node) + la pile d'instance
qui a conduit à ce contexte *)typescope_stack=(Lexeme.t*src_stack)(** Scope de base *)letmain_scope(m:Lexeme.t)=((m,[]);)letget_scope(m:Lexeme.t)(s:src_stack)=(m,s)(** Quand on a un lexeme, dans un contexte donné par un "scope_stack", on crée
le src_stack correspondant *)letget_src_stacklxmsstacke=((lxm,fstsstack,e)::(sndsstack))(** Pile de base (vide !!) *)letbase_stack()=[]letrecprint_src_stackss=(matchsswith[]->()|(i,c,_)::tl->(Printf.fprintfstdout" ident [%s] in context [%s]\n"(LutErrors.lexeme_detailsi)(LutErrors.lexeme_detailsc);print_src_stacktl))letrecstring_of_src_stackss=(matchsswith[]->""|(i,c,_)::tl->((Printf.sprintf" ident [%s] in context [%s]\n"(LutErrors.lexeme_detailsi)(LutErrors.lexeme_detailsc))^(string_of_src_stacktl)))lethead_of_src_stackss=(matchsswith|(i,_c,_)::_->i|[]->raiseNot_found)