2 Le mod`ele de conception Visitor
Dans le TP pr´ec´edent, l’implantation des traitements eval() et commut() modifie le code
source de nombreux fichiers Java. Outre le fait qu’il faut ensuite tout recompiler, cela disperse
l’information dans un trop grand nombre de classes de nœuds.
Il existe une autre fa¸con de faire, plus pratique, qui utilise le mod`ele de conception (”design
pattern”) Visitor. Selon ce mod`ele, on cr´ee une classe Java NomDuTraitement Visitor par trai-
tement. Cette ”classe de visite” doit impl´ementer (implements) l’interface Parser Visitor, o`u
Parser est le nom de votre analyseur syntaxique.
Dans cette classe de visite, on d´efinit une m´ethode de visite
public Object visit(MyNode n, Object d)
par classe de nœuds (ici, MyNode) et on y programme le traitement pr´evu pour cette sorte de
nœuds.
Par ailleurs, toutes les classes de nœuds h´eritent, via Node et SimpleNode, d’une m´ethode
public Object jjtAccept(ParserVisitor v, Object d);
Son premier param`etre accepte une instance d’une classe de visite telle que NomDuTraitement Visitor.
Invoquer cette m´ethode sur un nœud de classe MyNode appelle, par liaison dynamique, la
m´ethode de visite
public Object visit(MyNode n, Object d)
d´efinie dans NomDuTraitement Visitor et provoque ainsi l’application du traitement voulu.
En ajoutant l’option VISITOR=true; JJTree automatise la plupart de ces tˆaches : il ajoute
la m´ethode jjtAccept dans l’interface Node.java et dans toutes les classes de nœuds qui l’im-
plantent. De plus, il cr´ee le fichier Parser Visitor avec un contenu tel que
/* Generated By:JJTree: Do not edit this line. ParserVisitor.java */
public interface ParserVisitor {
public Object visit(SimpleNode node, Object data);
public Object visit(MyNode node, Object data);
...
}
avec une m´ethode de visite par classe de nœuds.
Le grand avantage de cette fa¸con de faire est que le code des classes des nœuds reste ensuite
constant : Pour ajouter un nouveau traitement, on d´eveloppe simplement une nouvelle classe de
visite, et on la fait accepter par la racine de l’arbre de syntaxe abstraite.
1. Appliquer cette technique `a la fonction eval(), en d´eveloppant une classe EvalVisitor.
2. Tester cette classe de visite.
3. D´evelopper une classe CommutVisitor pour la fonction commut().
2