Mon algorithme fait son petit fold et accumule les contraintes. Alors, comme on parle d'un langage assez compliqué, on admet qu'on ne peut pas mettre d'expressions à droite d'une égalité (c'est vraiment nul, mais sinon il faut plus de travail pour déterminer le type, c'est pénible, et cela n'est que « local » à l'expression).
On peut donc écrire un bout de code dans ce genre là dans une disjonction de cas ocaml
VARDEF (le_type, le_nom, (INT x)) -> { references = construire_un_singleton le_nom ; contraintes = construire_un_singleton (EQ "int" le_nom) ; declarations = empty_set }
On peut aussi écrire un truc qui dit : ah bah oui, c'est bien défini
Je n'écris pas la fonction en entier, mais voilà comment ça tourne :
evalue_typeexpr(* entre dans la fonction *)SEQ(x,y)(* fait l'appel récursif droit *)TYPEDEF("toto","int")(* c'est un truc « final » : on applique la fonction de calcul *){references={"int"};contraintes={EQ("int","toto")};declarations={"toto"}}(* on a terminé l'appel récursif droit, on fait l'appel récursif gauche *)SEQ(z,t)(* fait l'appel récursif droit *)VARDEF("int","a",INT1)(* c'est un truc « final » : on applique la fonction de calcul *){references={"int"};contraintes={EQ("int","int")};declarations={}}(* on a terminé l'appel récursif droit, on fait l'appel récursif gauche *)VARDEF("toto","b",INT2)(* c'est un truc « final » : on applique la fonction de calcul *){references={"toto"};contraintes={EQ("toto","int")};declarations={}}(* on a terminé gauche et droite, on fusionne les deux résultats car c'est ce qu'il faut faire avec un SEQ *){references={"toto","int"};contraintes={EQ("toto","int");EQ("int","int")};declaration{}}(* on a terminé gauche et droite pour la grosse expression, on fusionne les deux résultats car c'est encore un SEQ *){references={"toto","int"};contraintes={EQ("int","toto");EQ("toto","int");EQ("int","int")};declarations={"toto"}}
Alors j'ai très mal choisi la notation EQ qui correspond à ta flèche -> ... Mais après, une fois qu'on a ce résultat, on peut regarder si tout ce qui est référencé est déclaré : ici ce n'est pas le cas, car on devrait dire que « int » est toujours déclaré. Ensuite, on peut éventuellement regarder si le graphe est bien fait au niveau des contraintes.
[^] # Re: Dans l'art voluptueuse de ne rien comprendre
Posté par Aluminium95 . En réponse au journal EDSL et F-algèbres. Évalué à 1.
Visiblement on est pas très fort pour communiquer :-).
Je vais faire du pas à pas sur un exemple :-p.
L'arbre pourrait ressembler à ça :
Mon algorithme fait son petit fold et accumule les contraintes. Alors, comme on parle d'un langage assez compliqué, on admet qu'on ne peut pas mettre d'expressions à droite d'une égalité (c'est vraiment nul, mais sinon il faut plus de travail pour déterminer le type, c'est pénible, et cela n'est que « local » à l'expression).
On peut donc écrire un bout de code dans ce genre là dans une disjonction de cas
ocaml
VARDEF (le_type, le_nom, (INT x)) -> { references = construire_un_singleton le_nom ; contraintes = construire_un_singleton (EQ "int" le_nom) ; declarations = empty_set }
On peut aussi écrire un truc qui dit : ah bah oui, c'est bien défini
On doit aussi écrire le cas où on tombe sur un
SEQ, pour cela, on se contente de fusionner les contraintes et les références avecunion_set.Je n'écris pas la fonction en entier, mais voilà comment ça tourne :
Alors j'ai très mal choisi la notation
EQqui correspond à ta flèche->... Mais après, une fois qu'on a ce résultat, on peut regarder si tout ce qui est référencé est déclaré : ici ce n'est pas le cas, car on devrait dire que « int » est toujours déclaré. Ensuite, on peut éventuellement regarder si le graphe est bien fait au niveau des contraintes.