L3/TL — TP 3 Analyse syntaxique et mod`ele de conception

L3/TL — TP 3
Analyse syntaxique et mod`ele de conception
Ce TP est la suite du TP 2 sur la compilation des expressions arithm´etiques. Il montre comment
appliquer plusieurs fonctions diff´erentes sur les mˆemes arbres de syntaxe abstraite (ASA), en
utilisant un mod`ele de conception.
1 Solution du TP 2
Dans le TP 2, les expressions arithm´etiques sont soit ´evalu´ees num´eriquement, par la m´ethode
eval(), soit transform´ees en leur forme commut´ee, par la m´ethode commut(). Dans les deux cas,
on suit les 4 ´etapes suivantes :
1. Implantation de la m´ethode, eval() ou commut(), dans chaque classe d’ASA.
2. D´efinition de cette m´ethode dans l’interface Node.java et implantation d’une version par
d´efaut dans SimpleNode.java
3. Invocation de cette m´ethode sur le nœud racine de l’ASA (apr`es sa construction par analyse
syntaxique).
4. Visualisation de l’expression obtenue, par exemple avec la m´ethode dump(">").
1.1 Exemple de la m´ethode commut()
1. Implanter la m´ethode commut() dans tous les fichiers AST*.java
Par exemple, dans ASTAdd.java, on peut ´ecrire :
public Node commut() {
Node filsgauche, filsdroit;
filsgauche = this.jjtGetChild(0).commut();
filsdroit = this.jjtGetChild(1).commut();
return(this);
}
2. D´efinir commut() dans SimpleNode.java
public Node commut() { return(null); }
D´eclarer cette m´ethode dans l’interface Node.java
public Node commut();
3. Dans la classe ex´ecutable (Launcher.java), appeler la m´ethode commut() `a partir de la
racine de l’arbre, puis visualiser l’ASA r´esultat
n.commut();
((SimpleNode) n).dump(">");
Comparez votre solution avec cette correction. Si besoin est, suivez les ´etapes de cette cor-
rection, v´erifiez son bon fonctionnement sur quelques exemples et reprenez ces ´etapes pour la
m´ethode eval().
1
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
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !