Exercices 4 (Solutions)
Dans Token.java,
Tree.java,
Analyzer.java et
AnalyzerTest.java
vous trouvez des propositions de solution pour réaliser
la suite d'exercices 4.
Les méthodes apply (voir Tree.java) et
visit (voir Analyzer.java) contiennent
des séquences de print-commandes pour visualiser la communication
entre les visiteurs et les (sous-)arbre.
Le résultat du quatrième exemple dépend de l'arbre
créé: 15.3 * (13 / 7) rend 28.414285714285718, tandis que
(15.3 * 13) / 7 rend 28.414285714285715. (Pourquoi?)
ad Exercice 14
Prenons d'abord le premier exemple. Une execution affiche le suivant:
**************************************************
*** visit >>> Num[23.6].apply(Analyzer@47858e)
*** Num[23.6] >>> Analyzer@47858e.caseNum(this)
23.6 = 23.6
C-à-d. après la création d'un analyseur
Analyzer@47858e, la méthode visit appelle
l'arbre Num[23.6] pour lui annoncer la visite du visiter
concret (Analyzer@47858e):
*** visit >>> Num[23.6].apply(Analyzer@47858e)
L'arbre Num[23.6] accepte et appelle la méthode
caseNum du visiteur:
*** Num[23.6] >>> Analyzer@47858e.caseNum(this)
------------
| | Num[23.6].apply(Analyzer@47858e)
| Num | <---------------------------------- visit
| | |
| | | Analyzer@47858e.caseNum(Num[23.6]) -----------------------
| 23.6 | ------------------------------------> | |
| | | Analyzer@47858e |
------------ | |
| result 23.6 | <---
| | |
| caseNum { | |
| result = tree.num | ----
| } |
| |
| caseOp |
| |
| |
| |
-----------------------
|
Dans le cas du deuxième exemple, il s'agit d'un arbre avec
des sous-arbres:
**************************************************
*** visit >>> Op[ Num[23.6], -, Num[0.6] ].apply(Analyzer@1134f4)
*** Op[ Num[23.6], -, Num[0.6] ] *** Analyzer@1134f4.caseOp(this)
*** visit >>> Num[23.6].apply(Analyzer@2bbd86)
*** Num[23.6] >>> Analyzer@2bbd86.caseNum(this)
*** visit >>> Num[0.6].apply(Analyzer@27bf11)
*** Num[0.6] >>> Analyzer@27bf11.caseNum(this)
23.6 - 0.6 = 23.0
Par conséquent, deux nouveaux visiteurs
(Analyzer@2bbd86
et
Analyzer@27bf11)
sont créés pour analyser les sous-arbres gauches
(Analyzer@2bbd86) et droits (Analyzer@27bf11).
Les schémas de communication se ressemblent.
-----------------
| | Op[...].apply(Analyzer@47858e)
| Op | <---------------------------------- visit
| / | \ |
| / | \ | Analyzer@47858e.caseOp(Op[...]) -----------------------
| | - | | ------------------------------------> | |
| | | | | Analyzer@47858e |
| | | | | |
| | | | | result 23.0 | <--
| | | | | | |
| | | | | caseNum | |
| | | | | | |
| | | | Num[23.6].apply(Analyzer@2bbd86) | caseOp { | |
| Num | | <--------------------------------- | visit(tree.left) | |
| | | | | | |
| | | | Analyzer@2bbd86.caseNum(Num[23.6]) | | |
| 23.6 | | -------------------------------- | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | -------------------- | | | |
| | | | | | | | |
| | | | Analyzer@2bbd86 | <--- | | |
| | | | | | | |
| | | | result 23.6 | | | |
| | | | | | | |
| | | -------------------- | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | Num[0.6].apply(Analyzer@27bf11) | | |
| Num | <---------------------------------- | visit(tree.right) | |
| | | | ... | ---
| | | Analyzer@27bf11.caseNum(Num[0.6]) | } |
| 0.6 | ---------------------------------- | |
| | | -----------------------
----------------- |
-------------------- |
| | |
| Analyzer@27bf11 | <---
| |
| result 0.6 |
| |
--------------------
|
Christine Röckl
Last modified: Fri May 17 12:20:14 DST 2002