---
# System prepended metadata

title: Rapport projet de compilation

---

# Rapport projet de compilation

Groupe C : Farouk AKHOUN, Ayten DEYAB, Mario PITASSI, Mattias ROUSSEAU

## Division de la charge de travail 

Le travail a été effectué en équipe durant toute la phase de développement du projet. Pour cela, différents créneaux ont été choisis pour permettre des réunions sur Discord. 

Plusieurs formats de session de travail ont pu être réalisés : 
- Compréhension du sujet, choix des options à développer.
- Réflexion sur les concepts à implémenter.
- Session de live-coding avec collaboration en direct.
- Répartition du travail sur des objectifs établis.


| Tâches         | Farouk | Ayten | Mario | Mattias |
| -------------- |:------:|:-----:|:-----:|:-------:|
| `If-Then-Else` |   x    |   x   |   x   |    x    |
| `Switch`       |   x    |   x   |   x   |    x    |
| `For`          |   x    |       |       |         |
| `Do While`     |        |   x   |       |         |
| Vérif. types   |        |       |   x   |    x    |
| Gestion erreurs|        |   x   |       |         |
| Rédaction      |   x    |   x   |   x   |    x    |

## Structures de contrôles implémentées.

### 1. `If-Then-Else`

Nous avons implémenté les structures `if` : 
- `"if" '(' expression ')' stm %prec WITHOUT_ELSE`

```
if_label:
    code du test
    goto then_label si == 0 sinon goto end_label
then_label:
    corps du then
    goto end_label
end_label:
    fin
```

- `"if" '(' expression ')' stm "else" stm`

```
if_label:
    code du test
    goto then_label si == 0 sinon goto else_label
then_label:
    corps du then
    goto end_label
else_label:
    corps du else
    goto end_label
end_label:
    fin
```

L'analyse du typage est effectuée sur `expression` et vérifie qu'elle est bien booléenne.

### 2. `Switch`

Pour l'implémentation de cette fonctionnalité les fichiers `StreeSWITCH.java`, `StreePRODUCT.java`, `StreeCASE.java` et `StreeDEFAULT.java` ont été modifiés.

Nous avons eu sur certaines visualisations générées par `graphviz (.dot)` des soucis d'ordre lors de la construction de l'arbre.
Notamment sur les `switch` où le nombre de cas est supérieur à deux.
En effet, par exemple, l'ordre des fils des`CJUMP` ou des `SEQ` pouvaient être inversés ce qui empêche à travers la visualisation d'avoir une interprétation logique.
Cependant, nous avons pu vérifier que dans tous les `.dot` générés l'ordre semble être respecté.
Cela nous amène à penser que `graphviz` ne respecte pas toujours l'ordre dans lequel sont initialisés les noeuds dans le but d'optimiser l'espace d'affichage. 
En conclusion nos [recherches sur internet](https://stackoverflow.com/questions/44274518/how-can-i-control-within-level-node-order-in-graphvizs-dot) nous ont menés à trouver des problématiques similaires, ce qui nous conforte dans l'idée de se fier uniquement au fichier `.dot`.


```
Soit une variable T <- U telle que l'on a switch(U) {...}

Pour chaque cas CX tel que X : (1,...k) et k le nombre de cas :
- Soit le label LX.
- Soit le couple (VX,SX) tel que l'on a "case VX : SX".
- Soit Code(SX) le code des instructions à exécuter.

goto test

L1: code(S1)
    goto end
         
L2: code(S2)
    goto end
        
...
    
LK: code(SK)
    goto end

LD: code(SD)             // optional (default)

goto end

test: 
    goto L1 si T = V1
    
    goto L2 si T = V2
    
    ...
    
    goto LX si T = VX
    
    goto LD sinon         // optional (default)
    
end:
    suite...    
```

### 3. `For`

Nous avons implémenté la boucle `for` : 
- `"for" '(' assignment_stm ';' expression ';' simple_stm ')' stm `

```
Soit une boucle: for (assignment; expr; simple_stm) stm

    assignment
    for_label:
        test expr
        goto true_label si == 0 sinon goto false_label
    true_label:
        stm
        simple_stm
        goto for_label
    false_label:
        fin
```

L'analyse du typage est effectuée sur `expression` et vérifie qu'elle est bien booléenne.


### 4. `Do-While`

```
Soit une boucle: do stm while (expr) 

    do_label:
        stm
        test expr
        goto do_label si == 0 sinon goto false_label
    false_label:
        fin
```

## Analyse du typage.

Nous avons pris le soin d'ajouter la plupart des `checkType()` et `getType()` manquant aux `STree` des opérations binaires et conditionnelles. Différents codes pourront être testés sans générer d'erreur.

## Production de messages d'erreur.

Nous avons ajouté un attribut `errorMessage` dans la classe `STree` ainsi qu'un setter pour pouvoir le modifier depuis des classes filles. Le fonctionnement est le suivant. Lorsqu'un `checkType` renvoie faux, un message d'erreur plus explicite concernant la cause de l'erreur est renvoyé. Cette initiative permet d'avoir une lecture plus précise des problèmes qui ont lieu lors de la vérification du typage. Et donc de pouvoir corriger son code plus facilement.