:: Enseignements :: ESIPE :: E4INFO :: 2009-2010 :: Génération de code ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | 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.
-
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.
-
A quoi servent les classes SymbolTable, Type, VarSymbol,
TypeCheckEnv, TypeCheckingVisitor ?
-
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.
-
A quoi servent les classes Location et ErrorReporter ?
-
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.
-
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.
-
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).
-
Tester l'application successive des deux visiteurs implémentés.
Faire en sorte d'avoir des messages d'erreurs explicites.
© Université de Marne-la-Vallée