Travaux dirigés de traduction : 10. Structures conditionnelles
Objectif
Le but de ce TD est de mettre en place des structures
conditionnelles. On partira d'un if minimaliste pour
enrichir ensuite le langage de structures supplémentaires.
Documentation
officielle sur Bison.
L'objectif est de produire du code pour la machine
virtuelle (v-code). La machine virtuelle est installée
sur vos machines sous le nom de virtual-mlv.
Le source de la machine virtuelle et la documentation
sont disponibles.
Dans un premier temps examinez les fichiers suivants, et
testez leur fonctionnement.
Rappel: Séquence de compilation.
- Utiliser le Makefile pour compiler avec bison, flex, puis gcc pour produire l'exécutable.
- Avec l'exécutable, traiter un programme d'entrée (par exemple le source de test) pour
obtenir un fichier contenant du code pour la machine virtuelle.
- Exécuter le code avec la machine virtuelle : laMachine leprog
Modifiez les programmes flex
et bison
de façon à autoriser
le else
optionnel. Comme en C, vous devrez
rattacher un else
au if
le plus
proche. Pour cela, vous utiliserez la
commande %prec
qui permet d'attribuer à
une règle une priorité correpondant à un
autre opérateur.
Note : Appuyez-vous sur les grammaires attribuées présentées
en cours. En particulier, faites attention au
placement des label
. Pour
utiliser la commande %prec
, il faut la placer à
la fin de la production correspondant
au if
sans else
pour donner une plus grande
priorité au terminal else
.
Modifiez les programmes flex
et bison
de
façon à autoriser
- les blocs d'instructions encadrés par des accolades ;
- une variable globale notée
X
à laquelle on
pourra accéder en lecture et en écriture
grâce à une instruction de la forme X
=
val;.
Note : dans cet exercice, on ne demande pas que la grammaire
permette des déclarations de variables, donc il y aura une seule
variable globale X
. (Ce n'est pas une constante.)
Sa valeur à l'exécution sera placée
dans un emplacement spécifique de la pile (par exemple
l'adresse 0
), réservé avec l'instruction ALLOC
en début de code. Vous pouvez ensuite écrire du code C
qui a pour effet de produire le code de la
machine virtuelle pour, respectivement :
- affecter une valeur à X, c'est-à-dire récupérer la valeur en sommet de pile et la placer à l'adresse
0
- utiliser X, c'est-à-dire récupérer la valeur à l'adresse
0
et la placer au sommet de la pile