:: Enseignements :: ESIPE :: E4INFO :: 2007-2008 :: Compilation ::
[LOGO]

Table des symboles


Dans ce TD, nous allons commencer le travail sur l'arbre de syntaxe, c'est-à-dire le coeur du compilateur. Nous commencerons par calculer une table des symboles simple, qui sera enrichie au fil du TD.

Introduction

Pour ce TD nous allons utiliser un petit langage BoolExp qui permet de définir des variables et des fonctions de manipulations d'expressions booléennes, puis de les utiliser dans des expressions. Par exemple, le programme BoolExp suivant est valide :
Plutôt que de redévelopper les expressions rationnelles, la grammaire et les classes Java correspondantes, les classes nécessaires à la reconnaissance du langage BoolExp et à la construction de l'arbre de syntaxe vous sont fournies dans une archive ici.
L'archive contient un exemple de visiteur ir2.td7.PrintVisitor de l'arbre qui affiche l'arbre sous forme parenthésée et un programme principal l'utilisant ir2.td7.BooleanExprMain.

Exercice 1 - Affichage des symboles

Écrire un visiteur de l'arbre de syntaxe abstrait du langage qui imprime sur la sortie standard les symboles dans l'ordre de leur utilisation et définition. Ce visiteur pourra afficher pour l'exemple précédent :
Remarque : on ne cherche pas ici à résoudre la visibilité des variables.

Exercice 2 - Table de symboles en Java

Le but de cet exercice est d'implanter une classe ir2.td7.SymbolTableImpl pour gérer une table de symboles. Une table des symboles permet d'empiler les différents environnements associés à un symbole et de connaître l'environnement courant d'un symbole donné. Nous supposerons dans cet exercice qu'un environnement est de type String. Il est demandé dans cet exercice d'implanter une table d'empilement de symboles dont l'interface est la suivante :
Note : T est le type générique d'un environnement.

Exercice 3 - Visibilité des symboles

Les règles de visibilité pour les variables dans le langage BoolExp sont les suivantes :
  • une variable locale n'est visible que dans le bloc ou la déclaration qui l'introduit. Par exemple, un paramètre de fonction n'est plus visible en dehors de la fonction ;
  • une variable locale masque toute variable globale ou fonction de même nom ;
  • lors d'une définition de variable, dans exp de l'instruction var g = exp ;, le symbole g fait référence à sa définition précédente (variable ou fonction) si elle existe, sinon c'est une erreur ;
  • lors d'une définition de fonction, dans exp de l'instruction function f(...) = exp ;, le symbole f fait référence récursivement à cette définition de fonction.
Modifier le visiteur de l'exercice 1 pour qu'il calcule la table de symboles permettant d'afficher les utilisations de symboles en fonction des règles de visibilité. Par exemple, avec le même exemple de fichier source que dans l'exercice 1 l'affichage pourra être le suivant :
Indication : utiliser un environnement associant à chaque symbole le texte à afficher quand il est utilisé.