:: Enseignements :: ESIPE :: E4INFO :: 2010-2011 :: Génération de code ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | AST et visiteurs - Correction |
Le but de ce TP est de se re-familiariser avec le design pattern visiteur dans le but de parcourir l'AST produit par l'analyse syntaxique.
Préliminaires
- Télécharger et décompresser l'archive gc-ir2-td2-2011.zip
- Importer les répertoires td2, build-lib et lib dans votre projet eclipse
- Créer un répertoire td2/gen-src
- Mettre comme sourcePath td2/src et td2/gen-src
- Ajouter lib/tatoo-runtime.jar dans le buildPath.
Exercice 1 - AST et Visiteur
Soit la grammaire G:
start -> expr
expr -> expr '+' expr
expr -> 'val'
Les symboles '+' et 'val' sont des tokens: 'val' identifie un nombre réel.
Le but de l'exercice est d'implanter manuellement la hiérarchie de classes utilisée pour construire l'AST, puis d'écrire un visiteur pour évaluer les expressions arithmétiques reconnues par la grammaire.
- Construire manuellement la hiérachie de classes associée à la grammaire, qui sera utilisée pour construire l'AST. Ne pas utiliser Tatoo!
- Construire manuellement l'AST associé à l'expression "2.1+10.0+5".
- Modifier les classes pour permettre l'utilisation d'un Visiteur. Ecrire une interface Visitor associée à la grammaire.
- Ecrire un visiteur qui évalue les expressions arithmétiques.
- Tester sur l'AST.
Node.java
Expr.java (symbole non-terminal Expr)
Start.java (symbole non-terminal Start et production start -> expr)
ExprVal.java (production expr -> 'val')
ExprPlus.java (production expr -> expr '+' expr)
Interface Visitor
EvalVisitor
Exercice 2 - Génération automatique de l'AST avec Tatoo et évaluation
Le but de l'exercice est de refaire l'évaluation d'expressions arithmétiques à l'aide d'un visiteur utilisant les classes générées par Tatoo.
- Dans le fichier exo2.ebnf, faire en sorte d'associer chaque terminal "utile" à un type, pour qu'il puisse être exploité lors de l'évaluation d'une expression arithmétique par un visiteur.
- Générer les classes associées au lexeur, au parseur et à l'AST à l'aide de la tâche ant définie dans build.xml. Regarder les classes générées dans le package ast. A quoi servent-t-elles ?
- Dans la classe Td2AnalyzerMain, implanter l'interface Td2TerminalEvaluator chargée d'évaluer la valeur des terminaux.
- Ecrire une classe EvalVisitor qui calcule et affiche le résultat de l'expression arithmétique, en implémentant l'interface Visitor générée dans le package ast. Pour information, il est possible d'utiliser le type Void.
exo2.ebnf
EvalVisitor étendant la classe Visitor générée par Tatoo
Exercice 3 - Affichage d'expressions arithmétiques
Ecrire un nouveau visiteur PrintVisitor chargé d'afficher l'expression arithmérique. Si l'on entre l'expression "12.5 + 12 * 2 + 3", le visiteur devra afficher "+ + 12.5 * 2 12 3". Pour information, vous pouvez utiliser le type Void comme type de retour des méthodes visit ou comme celui des paramètres.
PrintVisitor
Td2Exo2AnalyzerMain
Exercice 4 - Evaluation de variables
Le but de l'exercice est d'écrire un évaluateur de variables réelles.
Par exemple, l'analyseur devra évaluer les variables définies comme dans le code suivant :
let x = 2.5;
let zoo1 = x - 1.2 * 2;
Le code à reconnaître est une séquence d'instructions d'affectation (let var = expr;):
var est une variable et expr une expression arithmétique.
Les valeurs sont sous la forme de variables (ex. x et zoo1) ou de constantes (ex. 2.4).
Les opérateurs sont +,- et *.
L'évaluation des variables ci-dessus donnera:
x = 2.5
zoo1 = 0.1
-
Modifier les règles lexicales et la grammaire de l'exercice précédent pour reconnaître des séquences d'affectations de variables.
-
Dans l'EBNF, typer maintenant les terminaux "utiles". Générer les classes de base de l'analyseur avec Tatoo (le fichier de configuration ant est build4.xml).
- Implémenter le Td2Exo4TerminalEvaluator dans la classe Td2Exo4AnalyzerMain.
- Implémenter un visiteur permettant d'évaluer et afficher les variables.
Indications:
- Utiliser une HashMap<String,Double> pour stocker les valeurs des variables.
exo4.ebnf
EvalVisitor
Td2Exo4AnalyzerMain
© Université de Marne-la-Vallée