Question 2_3 XML vers AST

Programmation Avancée

Modérateur : Douin

ideligniere
Messages : 8
Inscription : 08 oct. 2017 23:08

Question 2_3 XML vers AST

Message par ideligniere » 17 janv. 2018 0:44

Bonjour,

je bloque sur cette question, je ne vois pas trop comment reconstruire un ast à partir d'un Element xml.
Je pense qu'on doit vouloir décoder l'élément obtenu après désérialisation, j'ai essayé d'utiliser XMLDecoder en écrivant l'élément dans un fichier avant, mais si c'est bien ça, je ne dois pas m'y prendre correctement.

Si quelqu'un a des pistes pour m'éclairer...

Merci d'avance !

Isabelle

slash
Messages : 66
Inscription : 04 nov. 2017 2:45

Re: Question 2_3 XML vers AST

Message par slash » 17 janv. 2018 1:36

Bonsoir,

Je ne pense pas qu'il soit ici nécessaire d'utiliser XMLDecoder pour la désérialisation, SAXBuilder va très bien.
Pour ce qui est du TP, la classe XML2AST, qui prend en paramètre un objet Element (correspondant à la balise racine) et un contexte (mémoire), doit pouvoir te retourner l'Instruction de l'AST. Celle-ci étant composée d'instructions, d'expressions simples et d'expressions booléennes, on peut penser qu'il faille trois méthodes retournant Expression, ExpressionBooleenne et Instruction. Chacune d'entre elles évalue le nom de la balise, et construit, en fonction de cela, les différentes instructions ou expressions. Ainsi, si tu as xmlInst2ast() (qui teste si tu as une balise Sequence, ou TantQue, ou Pour, etc.) pour décoder une instruction, tu peux avoir xmlBool2ast() (qui teste si tu as Ou, Non, Et, etc.) pour décoder une expression booléenne, et xmlExp2ast() pour une expression simple (Constante, Variable, Addition, etc.) , que tu peux utiliser dans xmlInst2ast().

J'espère t'avoir aidée un peu.

julien_24
Messages : 47
Inscription : 17 oct. 2017 13:41

Re: Question 2_3 XML vers AST

Message par julien_24 » 17 janv. 2018 11:59

Bonjour,

C'est marrant j'ai fait comme slash, avec presque les memes noms pour les méthodes ;-)
Comme il reste peu de temps pour finir le TP je me permets de donner un peu plus de details à la solution de slash.

La methode xmlInst2ast prend en paramètre la memoire et un element et retourne une Instruction.

Dans cette methode tu verifies le nom de cette balise element (attention la premiere fois c'est la balise "programme")

j'ai utilise un switch case

Instruction instruction = null;
List<Element> elements = null;

switch(element.getName())
case "Sequence":
elements = element.getChildren(); // retourne un liste des elements enfants(enfants directs, de 1er niveau) de la balise que tu es en train de traiter
Sequence prend 2 paramètres eux aussi de Type Instruction, donc en parametres de ton constructeur de Sequence il faut reconstruire c'est deux instructions en réappelant la meme méthode xmlInst2ast
ce qui donne

instruction = new Sequence(xmlInst2ast(m, elements.get(0)), xmlInst2ast(m, elements.get(1)));
break;


etc.... pour toutes les instructions.

Apres le switch tu retourne instruction


Pour ce qui est des ExpressionBooleenne, tu peux creer une méthode

public static ExpressionBooleenne xmlBool2ast(Contexte m, Element element)
//avec la meme logique
ExpressionBooleenne expressionBooleenne = null;
List<Element> elements = null;

switch(element.getName())
case "Sup": // Sup prend 2 parametres de type Expression
elements = element.getChildren();
Sup prend en parametre deux Expressions donc dans la meme logique tu peux creer une methode pour gerer les expressions

expressionBooleenne = new Sup(xmlExp2ast(m, elements.get(0)), xmlExp2ast(m, elements.get(1)));
break;

case "Et": // prend 2 parametres de type ExpressionBooleeenne
elements = element.getChildren();
expressionBooleenne = new Et(xmlExpBool2ast(m, elements.get(0)), xmlExpBool2ast(m, elements.get(1)));
break;

etc .... pour les ExpressionBooleennne

Apres le switch tu retournes expressionBooleennne


public static Expression xmlExp2ast(Contexte m, Element element)

Expression expression = null;
List<Element> elements = null;

switch(element.getName())

case "Constante": // prend un seul parametre un Integer
expression = new Constante(Integer.parseInt(element.getText()));
break;

case "Multiplication": // prend 2 paramètres de type Expression
elements = element.getChildren();
expression = new Multiplication(xmlExp2ast(m, elements.get(0), xmlExp2ast(m, elements.get(1)));
break;

etc... pour toutes les expressions

Apres le switch tu retournes expression

J'espère t'avoir un peu aidé aussi.

julien

ideligniere
Messages : 8
Inscription : 08 oct. 2017 23:08

Re: Question 2_3 XML vers AST

Message par ideligniere » 17 janv. 2018 14:27

Bonjour,

merci à tous les deux pour vos réponses aussi précises et rapides ! C'est beaucoup plus clair maintenant :)

Isabelle

ALjava32
Messages : 8
Inscription : 15 juin 2015 11:12

Re: Question 2_3 XML vers AST

Message par ALjava32 » 17 janv. 2018 14:47

Merci à vous,
ça fait 3 jours que je suis bloquée dessus à essayer de parcourir les descendants (element.getDescendants()) sans résultats probants et avec des if en pagaille et un code long comme mon bras.
Je n'avais pas pensé à l'appel récursif de méthodes.
Merci :)

slash
Messages : 66
Inscription : 04 nov. 2017 2:45

Re: Question 2_3 XML vers AST

Message par slash » 18 janv. 2018 1:34

En fait, j'ai l'impression qu'il y a une règle d'Or (ou plutôt une conclusion) dans tous ces TP : le code de 3km de long n'est pas celui attendu ;)
Et d'ailleurs, c'est bien aussi l'utilité des patrons.

Lenny
Messages : 4
Inscription : 28 nov. 2017 3:06

Re: Question 2_3 XML vers AST

Message par Lenny » 19 janv. 2018 0:54

Bonsoir, je suis bloqué...rien d'urgent puisque j'ai rendu le tp9...incomplet !
case "Affectation":
elements = cc.getChildren();
ea = (Element)elements.get(0);
eb = (Element)elements.get(1);
ast = new Affectation(xmlInst2ast(m,ea),xmlInst2ast(m,eb));

(m,ea), l'erreur se trouve à ce niveau
incompatible types : tp6.question3.Instruction cannot be converted to tp6.question1.Expression
ea est un Element, simplement il est reconnu comme une Instruction ! , de plus idéalement il faudrait une Expression d'après la machine...Alors que la méthode a besoin d'un Contexte et d'un Element...voila un résumé du casse tête
Je n'ai pas trouvé de solution

Au final si quelqu'un pouvait pouvait donner la réponse à la question 2.3, je la ou le remercie d'avance.

slash
Messages : 66
Inscription : 04 nov. 2017 2:45

Re: Question 2_3 XML vers AST

Message par slash » 19 janv. 2018 1:22

Bonsoir,

Je vais essayer de te résumer ce que je fais dans XML2AST :

J'ai déjà la méthode xmlInst2ast qui renvoie une Instruction :

Code : Tout sélectionner

public static Instruction xmlInst2ast(Contexte m, Element element) throws Exception {
        Instruction inst = null;
        etc..........
        etc..........
        return inst;
}
Dans cette méthode, je teste si l'élément passé en paramètre est une instruction (j'ai utilisé des blocs if, mais un switch fait la même chose), par exemple :

Code : Tout sélectionner

if (element.getName()=="TantQue") {
            inst = new TantQue(xmlBool2ast(m,(Element)element.getChildren().get(0)),
                               xmlInst2ast(m,(Element)element.getChildren().get(1)));
}
if (element.getName()=="Pour") {
            inst = new Pour(xmlInst2ast(m,(Element)element.getChildren().get(0)),
                            xmlBool2ast(m,(Element)element.getChildren().get(1)),
                            xmlInst2ast(m,(Element)element.getChildren().get(2)),
                            xmlInst2ast(m,(Element)element.getChildren().get(3)));
}
Les méthodes utilisées dans les sélections peuvent être xmlInst2ast (si on a affaire à une instruction), ou xmlBool2ast (pour une expression boolénne), ou xmlExp2ast (pour une expression standard), méthodes que j'ai créées de la même manière que xmlInst2ast. Par exemple :

Code : Tout sélectionner

public static Expression xmlExp2ast(Contexte m, Element element) throws Exception {
        Expression exp = null;
        if (element.getName()=="Variable") {
            exp = new Variable(m,element.getValue());
        }
        if (element.getName()=="Constante") {
            exp = new Constante(Integer.parseInt(element.getValue()));
        }
        if (element.getName()=="Addition") {
            exp = new Addition(xmlExp2ast(m,(Element)element.getChildren().get(0)),
                               xmlExp2ast(m,(Element)element.getChildren().get(1)));
        }
        etc..............
        etc..............
        etc..............
        return exp;
}

Code : Tout sélectionner

public static ExpressionBooleenne xmlBool2ast(Contexte m, Element element) throws Exception {
        ExpressionBooleenne exp = null;
        if (element.getName()=="Non") {
            exp = new Non(xmlBool2ast(m,(Element)element.getChildren().get(0)));
        }
        if (element.getName()=="Ou") {
            exp = new Ou(xmlBool2ast(m,(Element)element.getChildren().get(0)),
                         xmlBool2ast(m,(Element)element.getChildren().get(1)));
        }
        if (element.getName()=="Et") {
            exp = new Et(xmlBool2ast(m,(Element)element.getChildren().get(0)),
                         xmlBool2ast(m,(Element)element.getChildren().get(1)));
        }
        etc..............
        etc..............
        etc..............
        return exp;
}
Au final, de manière récursive, on obtient bien une Instruction contenant la totalité de l'AST.

Lenny
Messages : 4
Inscription : 28 nov. 2017 3:06

Re: Question 2_3 XML vers AST

Message par Lenny » 19 janv. 2018 12:02

Merci clash pour l'explication,
un peu frustré de ne pas avoir trouvé la solution, mais bon je pense que j'ai suffisament travaillé dessus pour m'en souvenir.
le tp9 aura été celui, ou il fallait le moins lire le cours et ou il ne fallait pas suivre les consignes !

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité