:: Enseignements :: ESIPE :: E4INFO :: 2011-2012 :: Génération de code ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Évaluation par visiteur d'expressions Langset - Correction |
Ce TD est la continuation du précédent : nous cherchons maintenant à évaluer une expression Langset en utilisant un visiteur sur un AST.
Génération d'AST
Tatoo offre la possibilité de générer automatiquement un arbre de syntaxe pour une entrée donnée en utilisant la grammaire fournie.
- Modifier le fichier build.xml pour demander la création automatique des classes correspondant aux noeuds de l'AST.
- Modifier le fichier EBNF pour rajouter une section types: précisant qu'un token entier est de type int.
- Compiler le fichier EBNF avec ant ebnf et observer les classes produites.
- Écrire une classe LangsetASTBuilder dont le main construit l'AST d'une expression et affiche son noeud racine
Voici un bout de code pour analyser une entrée et construire l'AST :
Reader reader = new InputStreamReader(System.in);
/* TerminalEvaluator is used to evaluate the value of the terminals read by the analyzer */
LangsetTerminalEvaluator<CharSequence> terminalEvaluator = new LangsetTerminalEvaluator<CharSequence>() {
// TO IMPLEMENT
};
/* ASTGrammarEvaluator is used to construct the AST*/
ASTGrammarEvaluator grammarEvaluator = new ASTGrammarEvaluator();
/*constructs and run the analyzer with the reader, the terminalEvaluator and the grammarEvaluator*/
LangsetAnalyzers.run(reader, terminalEvaluator, grammarEvaluator, null, null);
/* start is the root of the AST */
Start start = grammarEvaluator.getStart();
Visiteur d'affichage d'expression
On souhaite implanter un premier visiteur chargé d'afficher une expression (exprimée sous la forme d'AST). Celui-ci doit être configurable afin d'obtenir un affichage :
- Préfixe (exemple : * + 1 + 2 3 + 3 4)
- Infixe (exemple : ( 1 + ( 2 + 3 ) ) * ( 3 + 4 ))
- Suffixe (exemple : 1 2 3 + + 3 4 + *)
On pourra ensuite pour le mode infixe chercher à supprimer les parenthèses inutiles.
Créer la classe PrintVisitor et y implanter le visiteur d'affichage. Cette classe étend Visitor<Void, Void, RuntimeException>, la classe Visitor a normalement été générée automatiquement par Tatoo dans le paquetage ast.
Visiteur d'évaluation
On écrit maintenant un visiteur réalisant l'évaluation d'une expression. Le résultat sera le même que celui obtenu à la fin du TD précédent ; l'approche est cependant ici différente puisque l'on construit un AST que l'on évalue ensuite par parcours avec un visiteur. On pourra étendre Visitor<Set<Integer, Void, RuntimeException> (on retourne Set<Integer>).
Une proposition de correction est disponible
ici (en incluant la correction du TD1).
© Université de Marne-la-Vallée