This commit is contained in:
Guillotin Damien 2022-01-11 17:37:52 +01:00
parent 27d712467c
commit 9b1a054e63

View file

@ -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.
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.