:: Enseignements :: ESIPE :: E4INFO :: 2009-2010 :: Génération de code ::
[LOGO]

AST et visiteurs


Le but de ce TD est d'implémenter un évaluateur de variables en construisant d'abord un AST puis en parcourant ce dernier à l'aide de visiteurs.

Préliminaires

Télécharger et décompresser l'archive gc-ir2-td3.zip. Importer le répertoire td3 dans votre projet eclipse.

Le fichier td3.ebnf spécifie une grammaire qui reconnait le code suivant par exemple :
				let x = 1 + 3*2;
				let w = 2 + if(x == 2) 3 else 1;
				let z = w - 1; 
				{     
				  let x = 5;
				}
			

L'évaluateur donnera le résultat suivant:
				x = 7
				w = 3
				z = 2
				x = 5;
			

Exercice 1 - Construction automatique de l'AST et visiteurs

Le but de l'exercice est d'implémenter un analyseur AnalyserMain qui construit l'AST associé au code analysé en entrée en utilisant l'AST généré par Tatoo. Pour cela, vous utiliserez la tache ant sur build.xml. Dans ce fichier de configuration, la tâche ebnf contient en plus un attribut generateast="true". Cette tâche va permettre de générer le lexeur et le parseur spécifiés dans td3.ebnf. Elle produira également le ASTGrammarEvaluator générant l'AST et les classes correspondants aux noeuds de l'AST (dans le package ast). Le squelette de l'analyseur se trouve dans la classe AnalyserMain.
Il s'agira ensuite d'implémenter et appliquer deux visiteurs de l'AST: l'un pour vérifier le typage des expressions, l'autre pour évaluer les différentes variables.

  1. Générer les classes grâce au fichier Ant. Ecrivez deux fichiers d'exemples test1.txt et test2.txt permettant de tester que la grammaire reconnait bien le language proposée.
  2. A quoi servent les classes SymbolTable, Type, VarSymbol, TypeCheckEnv, TypeCheckingVisitor ?
  3. Compléter le visiteur TypeCheckingVisitor qui verifiera que le code est valide en terme de typage. Les règles sont les suivantes :
    • Les constantes booléennes sont de type boolean, les constantes réelles de type double
    • Les opérations +, -, * ne marchent qu'entre deux réels
    • Les opérations == et != marchent pour les réels et les booléens, le résultat est un booléen
    • Les variables peuvent être de type double ou boolean
    • La condition d'un if doit être de type booléen et le type de l'expression si le if est vrai et le type de l'expression si le if est faux doivent être identiques.
    • Un bloc (entre accolades) définit un nouveau scope, une variable d'un scope peut masquer une variable d'un scope précédent.
    Signaler la première erreur grace à une runtime exception.
  4. A quoi servent les classes Location et ErrorReporter ?
  5. On souhaite maintenant signaler plusieurs erreurs et donc continuer le type checking après la première erreur. En cas d'erreur, vous pouvez utiliser soit le type attendu soit si plusieurs types sont possibles utiliser le type ERRONEOUS qui indique qu'il y a eu une erreur. Veillez à ne pas reporter plusieurs fois la même erreur. Pour signaler les erreurs, vous utiliserez la méthode report de l'ErrorReporter.
  6. Modifier le visiteur TypeCheckingVisitor pour sauvegarder dans la map des bindings l'association entre le symbole représentant une variable et les noeuds de l'arbre qui sont soit une déclaration soit une utilisation de la variable.
  7. Compléter le visiteur EvalVisitor qui évalue les différentes variables du code analysé. Vous supposerez que les contraintes sur les types dans les expressions ont été vérifiées (par le visiteur TypeCheckingVisitor).
  8. Tester l'application successive des deux visiteurs implémentés. Faire en sorte d'avoir des messages d'erreurs explicites.