Ce TP a pour but de créer une structure de données
VariableLookup que l'on trouve communément dans les compilateurs (enfin que l'on trouvait, car maintenant on fait mieux) et
qui associe à un nom de variable une position dans la pile.
En supposant que l'on utilise un langage qui ressemble à du C,
on peut voir le code comme une succession de:
-
création de variable (ça correspond à réserver une case sur la pile),
-
accès au contenu d'une case correspondant à une variable.
Lors de la création d'une variable, on associe une case mémoire à cette variable.
Et lors de l'accès au contenu d'une variable (représentée par le nom de la variable suivi d'un point d'interrogation dans les exemples)
on détermine dans quelle case mémoire se trouve le contenu de la variable, donc il faut pouvoir savoir à quelle case mémoire elle est associée.
On supposera que, comme en C, les variables n'existent plus après l'accolade fermante du bloc qui déclare cette variable.
{
int a; // case 0
int z; // case 1
a? // valeur de la case 0
{
int a; // case 2
a? // valeur de la case 2
int c; // case 3
z? // valeur de la case 1
}
a? // valeur de la case 0
{
int c; // case 2
}
c? // ahhh, erreur
int a; // ahhh, erreur
}
VariableLookup est une classe qui permet de gérer les variables d'un bloc. Lorsqu'un bloc est lui-même imbriqué dans un autre bloc (englobant), on utilisera un
VariableLookup parent pour accéder à la gestion du bloc englobant. Le
VariableLookup parent d'un bloc qui n'est imbriqué dans aucun autre sera
null.
La classe
VariableLookup possède les méthodes suivantes:
-
une méthode create qui prend en paramètre une autre VariableLookup ou null qui servira de parent lors de la recherche.
-
une méthode addVariable qui prend en paramètre le nom de la variable et ajoute cette nouvelle variable en lui associant un numéro de case mémoire. Elle renvoie l'indice de la case mémoire correspondante ou lève une exception si la variable existe déjà dans l'instance VariableLookup courante.
-
une méthode size qui renvoie le nombre de variables déclarées par le VariableLookup
et ses ancêtres (le parent, le parent du parent, etc).
-
une méthode find qui prend en paramètre le nom de la variable et renvoie soit l'indice de la case mémoire associée, soit rien, si aucune variable avec ce nom n'est trouvée. Il s'agit donc d'une valeur optionnelle (un Optional en Java).
Lorsque l'on recherche une variable, on cherche d'abord dans le VariableLookup courant et si on ne trouve rien, on va chercher dans le VariableLookup du parent (celui fourni lors de la création), etc.
Voilà le même code que précédemment annoté avec les appels de méthodes correspondant
{ // lookup = VariableLookup.create(null);
int a; // lookup.addVariable("a");
int z; // lookup.addVariable("z");
a? // lookup.find("a");
{ // lookup2 = VariableLookup.create(lookup);
int a; // lookup2.addVariable("a");
a? // lookup2.find("a");
int c; // lookup2.addVariable("c");
z? // lookup2.find("z");
}
a? // lookup.find("a");
{ // lookup3 = VariableLookup.create(lookup);
int c; // lookup3.addVariable("c");
}
c? // lookup.find("c");
int a; // lookup.addVariable("a");
}
Rappel: vous devez configurer le workspace d'Eclipse (File > Switch WorkSpace) pour
qu'il corresponde au répertoire
EXAM que vous avez dans le
home
de votre session de TP noté.
Vous pouvez consulter les transparents de cours ainsi que la documentation de l'API Java 9. Cette dernière est disponible en local ici:
file:///usr/local/apps/java9/docs/index.html.
Afin de faciliter la correction, on vous demande de tout écrire dans le fichier VariableLookup.java: il est interdit d'écrire du code dans un fichier auxiliaire.