Travaux dirigés de traduction : 9. Calculette avec table des symboles
Objectif
Le but de ce TD est de mettre en œuvre une table des
symboles. On va faire une variante de la
calculette du TD 8 pour autoriser que les noms des variables soient composés de plusieurs lettres. On traitera
également les expressions booléennes.
Documentation sur Bison.
Dans un premier temps, on ne manipulera que des variables
entières ou booléennes. Les déclarations seront faites
dans ce format :
booleen id1,id2;
entier id3,id4;
En partant éventuellement de la calculette du TD 8, ajouter à la grammaire attribuée la possibilité de faire ces déclarations, et écrire
le code C permettant de manipuler une table de symboles.
Pour simplifier, cette table sera un tableau de taille fixe (une constante).
Chaque enregistrement de la table des symboles contiendra la chaîne qui représente le
symbole, le type (une constante entière : 0 pour booléen, 1 pour
entier), la taille (entier et booléen font une taille de 1).
Pour cette calculette, on ajoute également dans les enregistrements
de la table des symboles un champ valeur qui représentera la valeur de
la variable une fois qu'on l'aura calculée
(alors que dans un compilateur C, la table des symboles n'existe qu'à
la compilation et ne contient pas la valeur des variables).
Dans les expressions arithmétiques, utiliser la table des
symboles pour gérer les valeurs des variables et leur type. Chaque identifiant devra être de type entier, et
avoir été défini dans la partie déclaration.
La "valeur" (au sens Bison) d'un nœud de l'arbre doit
contenir tous ses attributs. Pour les faire tenir tous à la fois, on peut
définir une structure qui regroupe, par exemple, les attributs
valeur et type d'une
expression. L'attribut type pourra être entier, booléen ou mauvais
(si on a une expression mal typée).
Ajouter à la grammaire les expressions booléennes. Elles
seront formées à partir de
- comparaisons (<=, >=, <, >) d'expressions arithmétiques,
- égalité ou différence (==, !=) d'expressions arithmétiques ou booléennes,
- combinaisons booléennes d'expressions booléennes (||, &&, !).
On autorisera l'utilisation des constantes
true
et
false.
Si Bison trouve des conflits dans votre grammaire attribuée,
analysez d'où il viennent, puis modifiez la grammaire ou les déclarations
pour les éliminer.
Indication : Pour éviter de créer des conflits, on peut utiliser un
même non-terminal pour les expressions arithmétiques et booléennes.
Ajouter la déclaration de tableaux
d'entiers ou de booléens. Ils sont déclarés ainsi :
entier tab1[5],tab2[7]
booleen tab3[2],tab4[8]
Utiliser les principes vus en cours pour
attribuer un type à chaque tableau.
La taille d'un tableau correspond au nombre d'éléments
qu'il contient. Comme pour les autres variables, l'attribut valeur
contiendra la valeur du tableau. On pourra
faire un malloc pour créer le tableau.
Pour simplifier le traitement des expressions contenant un nom de
tableau, on se limitera au cas où l'indice est une constante numérique.
Lors de l'accès à un tableau, vérifier le type.
Vous pouvez également vérifier la validité de l'indice.
Indication : Pour simuler un attribut hérité, le plus
simple est d'utiliser une variable globale initialisée par
une action placée avant le non-terminal qui
l'utilise.