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

Visiteurs et analyse en plusieurs passes


Le but de ce TD est de revoir les visiteurs d'arbres et implémenter un analyseur en plusieurs passes. Pour cela, nous générerons automatiquement l'AST à l'aide de tatoo.
ATTENTION: POUR CE TP, VOUS DEVEZ UTILISER UNE NOUVELLE VERSION DE TATOO QUI SE TROUVE DANS LE REPERTOIRE lib2 DE LA NOUVELLE ARCHIVE D'EXEMPLES.

Exercice 1 - Visiteur d'expressions booléennes

Le but de l'exercice est de générer automatiquement l'AST d'expressions booléennes puis de le parcourir avec un visiteur pour évaluer l'expression. Vous pouvez vous aider de l'exemple du tutoriel evaluation-autoast (nouvelle version de l'archive).

  1. Relire la procédure à suivre pour créer un analyseur sous Eclipse.
  2. Regarder l'exemple evaluation-autoast et la section Génération automatique de l'AST dans le tutoriel.
  3. Ecrire un fichier EBNF décrivant les règles lexicales et la grammaire de l'analyseur.
  4. Dans ce même EBNF, typer les tokens pertinents pour l'évaluation.
  5. Générer les classes de base de l'analyseur et de l'AST (tâche ant). Pour cela, reprendre et modifier le build.xml de l'exemple evaluation-autoast. Vous noterez que l'élément ebnf contient l'attribut generateast="true".
  6. Ecrire un TerminalEvaluator qui permet d'évaluer les tokens pertinents. Attention, les méthodes du TerminalEvaluator retournent des instances d'implémentations d'AbstractToken (package ast généré). Les constructeurs de ces types prennent la valeur du terminal (avec le type indiqué dans l'EBNF) comme argument. Pour aller plus vite, utiliser l'auto-complétion d'Eclipse.
  7. Ecrire une classe BooleanAnalyzer qui implémentera votre évaluateur d'expressions booléennes. Pour cela, vous instancierez un Reader pour lire l'expression en entrée standard. Vous créerez une instance de votre TerminalEvaluator et une instance d'un ASTGrammarEvaluator (dans le package ast généré). Cette dernière est chargée de construire l'AST lors de l'analyse de l'expression. Ces trois instances sont alors passées en argument de la méthode statique Analyzer.run() qui construira l'AST pour l'expression tapée en entrée standard. Inspirez-vous de la classe fr.umlv.tatoo.tutorial.evalautoast.EvaluationAutoAstAnalyzer de l'exemple du tutoriel.
  8. Ecrire un visiteur qui étend la classe Visitor du package ast généré. Ce visiteur devra évaluer l'expression booléenne. Inspirez-vous de la classe fr.umlv.tatoo.tutorial.evalautoast.EvaluationVisitor de l'exemple du tutoriel.
  9. Dans la classe BooleanAnalyzer, faites-en sorte de récupérer la racine de l'AST créé, avec la méthode getStart() de l'ASTGrammarEvaluator. Visiter l'AST à partir de la racine à l'aide du visiteur implémenté. Utiliser la méthode accept() de la racine, à laquelle vous passerez votre visteur comme premier paramètre et null comme second.

Exercice 2 - Analyse d'un langage non séquentiel

Soit un langage "fou" décrivant des opérations sur des string où les variables peuvent être initialisées après être utilisées.

Soit le script suivant:

			y = x * 4;
			x = z + ' ' +r + '!';			
			z = 'Coucou';
			r = 'Luc';
			print y;			
		
Un interpréteur de script classique indiquerait que la variable z est utilisée avant initialisation et il produirait une erreur. Nous souhaitons que notre script accepte ce code et produise l'affichage selon les règles suivantes:

Le script ci-dessus produira "y: Coucou Luc!Coucou Luc!Coucou Luc!Coucou Luc!".

  1. Ecrire le fichier ebnf décrivant les règles lexicales et la grammaire de l'analyseur, ainsi que le typage des tokens.
  2. Générer les classes fondamentales de l'analyseur et de l'AST (tâche ant).
  3. Créer une classe CrazyAnalyzer qui implémentera votre analyeur. Ecrire un TerminalEvaluator et GrammarEvaluator qui construit l'arbre syntaxique pour le script analysé.
  4. Ecrire un visiteur qui évalue les différentes variables du script (quand c'est possible). Il testera aussi si une variable est assignée plusieurs fois. Si c'est le cas, lever une exception!
  5. On souhaite maintenant que toutes les variables puissent être évaluées. Pour cela, on appliquera le visiteur précédent en boucle tant que l'on arrive à évaluer de nouvelles variables. A la fin de la boucle, on procède à l'affichage des variables désirées. Si une variable reste non évaluées, on indiquera une erreur.

Exercice 3 - Analyse d'un langage non séquentiel...la suite

On souhaite maintenant que l'analyseur du script affiche également, pour chaque variable désirée, l'expression de l'ensemble des opérations effectuées pour l'évaluer. Ainsi, l'analyse du code du premier exercice produirait :
				y:  Coucou Luc!Coucou Luc!Coucou Luc!Coucou Luc!
				=> (('coucou') + ' ' +('Luc') + '!')*4