# Évaluation finale du compilateur 2015/2016

## 0 - Compilation du compilateur

Compilez votre compilateur à l'aide d'un Makefile.

## 1 - Exécution sur des exemples existants

Modifiez le script `testAll.sh` fourni (version d'évaluation) en modifiant le chemin vers l'exécutable de votre compilateur. Ouvrez le script et lisez attentivement les instructions pour modifier également les options/chemins qui permettent de générer du XML arbre abstrait, table des symboles et mips. Ensuite, exécutez-le pour effectuer les tests ci-dessous 100% automatiquement

Analysez les programmes suivants (il s'agit des exemples connus, fournis comme base de tests minimale):

eval1.l
eval2.l
eval3.l
eval4.l
eval5.l
eval1-err.l

## 2 - Exécution sur de nouveaux exemples

### 2.1 Exemples compilés OK

Compilez à l'aide de votre compilateur, les programmes suivants, et vérifiez que tout se passe bien :

eval6.l | eval16.l
eval7.l | eval17.l
eval8.l | eval18.l
eval9.l | eval19.l
eval10.l | eval20.l
eval11.l | eval21.l
eval12.l | eval22.l
eval13.l | eval23.l
eval14.l | eval24.l
eval15.l |

### 2.2 Exemples pas compilés

Vérifiez que les programmes suivants ne compilent pas :

eval2-err.l
eval3-err.l
eval4-err.l
eval5-err.l
eval6-err.l
eval7-err.l
eval8-err.l
eval9-err.l
eval10-err.l
eval11-err.l
eval12-err.l

## 3 - Ajout de l'expression conditionnelle `?:`

On désire ajouter à notre langage une expression conditionnelle à l'aide des opérateurs `?` et `:` dont voici la syntaxe:

`expression -> condition '?' expressionvrai ':' expressionfaux | condition`

Cette expression donne la valeur de `expressionvrai` si la valeur de `condition` est vraie, et la valeur de `expressionfaux` si la valeur de `condition` est fausse. Autrement dit, c'est comme une instruction `si` qui, au lieu de choisir entre deux blocs d'instructions, choisit entre les valeurs de deux expressions. Par exemple, `$a > 10 ? 1 : 0` vaut 1 si `$a = 11, 12, 13...` et zéro pour toute valeur de $a inférieure ou égale à 10.

Sa précédence est la moins importante de toutes, inférieures à celle du `ou`. Vous devez donc la rajouter au niveau du non-terminal `expression` dans la grammaire. Contrairement aux autres expressions du langage L, cette expression est associative droite, c'est-à-dire, `1 ? 0 : 1 ? 0 : 1` doit être interprété comme `1 ? 0 : (1 ? 0 : 1)` et vaut 0.

Modifiez l'analyseur lexical, l'analyseur syntaxique, la structure de l'arbre abstrait, et la génération de code afin de prendre en compte cette nouvelle instruction.

Vous testerez votre nouvel analyseur sur les programmes suivants:

eval25.l
eval26.l
eval27.l
eval13-err.l - ne doit pas compiler