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