tp6, question 1, VisiteurEvaluation

Programmation Avancée

Modérateur : douinj

djabir_w
Messages : 7
Inscription : 25 oct. 2020 14:08

tp6, question 1, VisiteurEvaluation

Message par djabir_w » 19 nov. 2020 0:10

Bonjour,

J'ai beaucoup de mal avec ce TP, si quelqu'un peut m'aider. J'ai cherché dans le cours, mais je ne trouve rien. J'ai pu compléter la classe VisiteurPostFixe, qui est similaire à VisiteurInfixe. Cependant, je bloque complètement sur VisiteurEvaluation.

Je pense être sur d'au moins une chose: Pour effectuer les opérations, par exemple Soustraction, il faut appeler la méthode lire(), avec en paramètre le nom de la variable, pour pouvoir effectuer l'opération.

Code : Tout sélectionner

public Integer visite(Soustraction s) {
        return c.lire(...) - c.lire(...);
}
Ma première solution, pour récupérer le nom de la variable et donc sa valeur, était celle-ci:

Code : Tout sélectionner

Variable v1 = (Variable) s.op1();
Variable v2 = (Variable) s.op2();
return c.lire(v1.nom()) - c.lire(v2.nom());
Cela "fonctionne" pour

Code : Tout sélectionner

new Soustraction(i,j)
mais pas pour

Code : Tout sélectionner

new Soustraction(i, new Soustraction(i, j))
car Soustraction ne peut pas etre casté en Variable. Dans ce cas la, je ne vois pas du tout comment aller chercher les Integers dans la HashMap de Memoire. Il me faut le nom des variable, mais je ne vois pas comment les récupérer.

Je ne sais pas si c'est une solution toute simple, ou si je me trompe totalement de marche à suivre, je suis bloqué.

Merci de votre aide.

moro_al
Messages : 27
Inscription : 01 oct. 2020 21:34

Re: tp6, question 1, VisiteurEvaluation

Message par moro_al » 19 nov. 2020 1:05

Ma première solution, pour récupérer le nom de la variable et donc sa valeur, était celle-ci:
Ce n''est pas forcément une variable, op1 ou op2 peuvent être aussi une classe fille de la classe 'Binaire", donc passer par lire ne renverra rien.
C'est ce qui se passe dans :

Code : Tout sélectionner

new Soustraction(i, new Soustraction(i, j))
ton second paramètre est de Classe Soustraction qui hérite de Binaire, donc pas de méthode pour "lire" la valeur de la variable dans la mémoire car ce n'en est pas une.
Pour évaluer les paramètre il va falloir les visiter.

pour réaliser la soustraction donnée en exemple :

i - visite -> c'est une variable / constante, le visiteur renvoi la valeur via sa surcharge public Integer visite(Variable v) ).

est soustrait à :

new Soustraction(i, j) - visite -> C'est une soustraction, le visiteur renvoi sur l'interprétation d''une soustraction via public Integer visite(Soustraction s) et va ensuite évaluer les deux paramètres comme pour le premier opérande.

Il y a un "cycle" a voir, en appliquant sur les paramètres le visiteur, on les "traite" via la signature des méthodes appropriée.

Ce qui donnera :

Code : Tout sélectionner

    public Integer visite(Soustraction s) {
        return s.op1().accepter(this) - s.op2().accepter(this);
    }

J'ai un peu de mal a expliquer désolé

djabir_w
Messages : 7
Inscription : 25 oct. 2020 14:08

Re: tp6, question 1, VisiteurEvaluation

Message par djabir_w » 19 nov. 2020 9:08

Merci de ta réponse. Ce que tu m'as proposé est ce que j'avais essayé en premier, me paraissant le plus logique. Malheureusement, cela me renvoie une NullPointerException. Si je ne me trompe pas, dans la question 1, les seuls changements à faire sont dans VisiteurEvaluation, VisiteurInfixe et Postfixe. J'ai réouvert le projet en partant de 0, utilisé ta solution exact, et j'ai toujours le NullPointerException.

Dans le préliminaire, dans la classe Variable, la méthode lire() est utilisée:

Code : Tout sélectionner

public int interprete(Contexte c) {
		return c.lire(this.nom);
}
A la création d'une Variable, celle-ci est écrite dans la HashMap de Memoire avec ecrire(), il ne faudrait pas donc appeler la méthode lire() pour aller la chercher à un moment ? Avec la solution que tu m'as donnée,

Code : Tout sélectionner

c.lire(...)
n'est utilisé nul part dans le code, ça fonctionne bien pour toi ?
C'est aussi la solution que je vois dans le cours, mais j'ai toujours la même exception.

Code : Tout sélectionner

public Integer visite(Soustraction s) {
        return s.op1().accepter(this) - s.op2().accepter(this);
}
    
public Integer visite(Addition a) {
        return a.op1().accepter(this) + a.op2().accepter(this);
}
Je lance testSoustraction et j'ai un NullPointer. Autre exemple:

Code : Tout sélectionner

public static void main(String[] args) {
    Memoire m  = new Memoire();
    Variable i  = new Variable(m,"i",3);
    Variable j = new Variable(m,"j",5);
    VisiteurExpression<Integer> ve = new VisiteurEvaluation( m);
    VisiteurExpression<String> vi = new VisiteurInfixe( m);
    VisiteurExpression<String> vp = new VisiteurPostfixe( m);
    System.out.println(new Soustraction(new Addition(i, j), new Constante(5)).accepter(ve).intValue());
    // System.out.println(new Addition(new Addition(i, j), new Constante(5)).accepter(vi).intValue());
Me donne, lorsque j'utilise VisiteurEvaluation

Code : Tout sélectionner

java.lang.NullPointerException
	at question1.VisiteurEvaluation.visite(VisiteurEvaluation.java:16)
	at question1.VisiteurEvaluation.visite(VisiteurEvaluation.java:3)
	at question1.Addition.accepter(Addition.java:10)
	at question1.VisiteurEvaluation.visite(VisiteurEvaluation.java:12)
	at question1.VisiteurEvaluation.visite(VisiteurEvaluation.java:3)
	at question1.Soustraction.accepter(Soustraction.java:10)
	at question1.VisiteurEvaluation.main(VisiteurEvaluation.java:33)
	
Mais, lorsque j'utilise VisiteurInfixe (non touchée), ca me donne:

Code : Tout sélectionner

((i + j) + 5)
Honnêtement je suis complètement perdu.

douinj
Messages : 204
Inscription : 18 mars 2009 15:46

Re: tp6, question 1, VisiteurEvaluation

Message par douinj » 19 nov. 2020 9:20

Bonjour

Quel est le raisonnement dans l'évaluation d'une variable en java ? si vous lisez cette ligne x = x +2;

à suivre...

/** Visite d'une instance de la classe Affectation.
*
* l'affectation, X = Exp, Exp est une expression arithmétique <br>
* <code>
*
* M,Exp -interprete-> N <br>
* ________________________________<br>
* M, X = Exp -interprete-> M[X]=N <br>
* </code>
*
* @param a une affectation
* @return la mémoire résultante
*/
public Contexte visite(Affectation a){
Integer n = a.exp().accepter(this.vi); // M,Exp -interprete-> N
// --------------------------------
vi.contexte().ecrire(a.v().nom(),n); // M[X]=N
return this.vi.contexte();
}

djabir_w
Messages : 7
Inscription : 25 oct. 2020 14:08

Re: tp6, question 1, VisiteurEvaluation

Message par djabir_w » 19 nov. 2020 10:43

Je suis désolé Mr Douin, mais je ne vois malheureusement pas du tout ou vous voulez en venir.

Votre cours semble dire que ceci est la solution:

Code : Tout sélectionner

public Integer visiteAddition(Addition a) {
	Integer i1 = a.op1().accepter(this);
	Integer i2 = a.op2().accepter(this);
	return i1 + i2;
} 
Mais cette solution me renvoie une valeur nulle à chaque fois, et je n'arrive pas à comprendre pourquoi, malgré tous mes efforts.
Je comprends cette ligne:

Code : Tout sélectionner

x = x + 2
Mais je ne vois pas comment (et OU) appliquer ce concept. Je suis désolé.

douinj
Messages : 204
Inscription : 18 mars 2009 15:46

Re: tp6, question 1, VisiteurEvaluation

Message par douinj » 19 nov. 2020 11:29

re - bonjour

Quel est le code de votre visite pour une constante et pour une variable ?

à suivre

djabir_w
Messages : 7
Inscription : 25 oct. 2020 14:08

Re: tp6, question 1, VisiteurEvaluation

Message par djabir_w » 19 nov. 2020 12:06

Bonjour Mr Douin,

Merci beaucoup, votre remarque m'a pointé vers le problème, que j'ai résolu. C'était effectivement ces 2 méthodes.

Désolé pour le dérangement, excellent journée.

moro_al
Messages : 27
Inscription : 01 oct. 2020 21:34

Re: tp6, question 1, VisiteurEvaluation

Message par moro_al » 19 nov. 2020 15:00

J'espère ne pas t'avoir plus embrouillé qu'autre chose :/

djabir_w
Messages : 7
Inscription : 25 oct. 2020 14:08

Re: tp6, question 1, VisiteurEvaluation

Message par djabir_w » 20 nov. 2020 20:31

Non du tout, merci beaucoup, ta réponse était correct!

Répondre