From 9b1a054e631b01cc6f73f5ad30cb9702099c5e61 Mon Sep 17 00:00:00 2001 From: Guillotin Damien Date: Tue, 11 Jan 2022 17:37:52 +0100 Subject: [PATCH] the end --- rapport.md | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) diff --git a/rapport.md b/rapport.md index 249f3dd..16dd4e3 100644 --- a/rapport.md +++ b/rapport.md @@ -73,4 +73,91 @@ Pour récupérer un élément d'un tuple, on récupère le placement de ce tuple ## Tests L'ensembles des tests passent pour notre compilateur. -De même l'ensemble des contrats de toutes les fonctions des passes ont été rédigés, et des commentaires ont été introduits dans les sections les plus difficiles à comprendre. \ No newline at end of file +De même l'ensemble des contrats de toutes les fonctions des passes ont été rédigés, et des commentaires ont été introduits dans les sections les plus difficiles à comprendre. + +## Jugements de typages + +### Pointeurs + +$$ +\sigma \vdash : \text{Pointeur}(\text{Undefined}) +$$ + +$$ +\frac{ + \sigma \vdash T : \tau +}{ + \sigma \vdash new\ T : \text{Pointeur}(\tau) +} +$$ + +$$ +\frac{ + \sigma \vdash \text{id} : \tau +}{ + \sigma \vdash \&\ \text{id} : \text{Pointeur}(\tau) +} +$$ + +$$ +\frac{ + \sigma \vdash a : \text{Pointeur}(\tau) +}{ + \sigma \vdash * a : \tau +} +$$ + +### Incrémentation + +Puisque nous remplaçons le `+=` par une assignation combinée à l'opérateur binaire `+`, le jugement de typage est le même que ceux dans le cours page 101. Dans notre cas on obtient: + +$$ +\frac{ + \sigma \vdash a : \text{int} \quad + \sigma \vdash e : \text{int} +}{ + \sigma \vdash a \mathrel{+}= e : \text{int} +} +$$ + + +### Type nommé + +Puisque nous remplaçons lors de l'étape de la passe AstTds les alias par leurs vrais type, les jugements de typage vus en cours s'appliquent directement. + + +### Enregistrements + +Lors de l'appel d'un attribut d'un affectable, il faut que cet affectable soit un type struct et que affectable ai bien un attribut du nom demandé. Ainsi, sont type est le type de l'objet du nom demandé dans le type de l'affectable. + +$$ +\frac{ + \sigma \vdash a : \text{struct} \{ \dots,\ n:\tau ,\ \dots \} +}{ + \sigma \vdash a.n : \tau +} +$$ + +Ensuite il faut vérifier lors d'une initialisation ou d'une affectation que les types de chaques tuples sont deux à deux compatibles. De même cela implique que la cardinalité des deux tuples est égale. + +$$ +\frac{ + \sigma \vdash a : \text{struct} \{ \dots,\ s_n:\tau_1 ,\ \dots \} \quad + \sigma \vdash e : \text{struct} \{ \dots,\ s_n:\tau_2 ,\ \dots \} \quad + \tau_1 = \tau_2\ \forall n +}{ + \sigma \vdash a = e +} +$$ + +## Conclusion + +### Dfficultés rencontrées + +L'implentation des type nommés et de l'instruction assignation-addition a été assez intuitive et rapide à faire. En revanche, pour l'ajout des pointeurs, bien que nous l'ayons vu en TD, il a été assez difficile de comprendre et mettre en place l'utisation d'affectables. En effet, l'utilsation de `dref` étant récursive, elle fut subtile à implenter. + +Bien que nous étions déjà assez familier avec les affectables, l'apparition des enregistrements nous a insité à créer beaucoup de fonctions intermédiaires en vu de la complexité de la structure du type `struct`. + +### Améliorations éventuelles + +Comme nous l'avons fait avec les `print`, afin d'améliorer le nombre d'opérateurs disponibles à l'utilisateur sans qu'il y ait à créer des fonctions supplémentaire, nous pourrions ajouter l'opérateur `=` pour les rationels ou les enregistrement, ainsi que généraliser l'opérateur `+` pour les rationels.