IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Design Patterns Discussion :

comment utiliser le design pattern de visiteur pour créer un compilateur


Sujet :

Design Patterns

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut comment utiliser le design pattern de visiteur pour créer un compilateur
    Bonjour,

    J'aimerais savoir comment utiliser le design pattern de visiteur pour créer un compilateur.

    j'ai une grammaire, puis en utilisant un convertisseur BNF j'arrive à générer un fichier (.java) représentant le design pattern de visiteur.

    Je dois utiliser ce dernier pour construire un compilateur spécifique au langage spécifié, mais j'ai un problème avec le type retourné.

    c.à.d:

    "The meaning of the Java Visitor

    interface Exp.Visitor <R,A>: collection of methods for

    * visiting trees of type Exp
    * returning a value of type R
    * using an extra argument of type A"

    Si je veux utiliser plusieurs types, j'ai un problème car je dois remplacé R avec un seul types.

    Merci

    Katim

  2. #2
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    Tu pars d'une BNF, pour arriver à un .java (le code = pattern visiteur , mais visiteur de quoi ? quel rapport avec la BNF du départ? )

    Ensuite le Visiteur doit prendre un langage , et générer un compilo ?

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    bonjour,

    " La création d'un arbre syntaxique abstrait pour un langage décrit par sa grammaire est facile pour la plupart des langages."

    Généralement une grammaire est spécifiée en utilisant la notation BNF. Une fois j'ai la spécification du grammaire , je peux utiliser un BNF convertisseur pour générer automatiquement cet arbre. Et j'arrive à générer aussi un fichier (.java) représentant le design pattern de visiteur.

    Ainsi que la construction des compilateur moderne se base sur l'utilisation du design pattern de visiteur.

    En bref, j'ai un arbre syntaxique abstrait et je veux visiter ses nœuds.je veux utiliser ce fichier généré pour construire un compilateur.

    Merci

    Katim

  4. #4
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    Selon moi, un compilateur est bien plus que la simple utilisation de visiteur sur un arbre syntaxique. Il faut généralement y associer un automate à états (et bien souvent à pile) ainsi qu'un table des noms et des valeurs (pour les variables définies au cours du langage par exemple).

    Quoiqu'il en soit, le pattern visiteur permet en gros d'ajouter des méthodes à un composite (ici ton arbre syntaxique) sans y toucher (donc ca correspondrait un peu à ce que tu veux).

    J'ai bien compris ton histoire, mais je ne vois pas où se situe ton problème exactement. Tu n'arrive pas à utiliser ton Visiteur ? Pourquoi ne le code tu pas toi même (ou dit autrement, quel gain apporte sa génération?) ?

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    j'ai un problème avec le type retourné.

    c.à.d:

    "The meaning of the Java Visitor

    interface Exp.Visitor <R,A>: collection of methods for

    * visiting trees of type Exp
    * returning a value of type R
    * using an extra argument of type A"


    Si je veux utiliser plusieurs types, j'ai un problème car je dois remplacé R avec un seul type.

    par exemple, si j'ai un arbre représentant les expressions arith pour les entiers et pour les réels???

    est ce que vous pouvez m'aider sur les visiteurs en java??

    Merci.
    Katim

  6. #6
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    par exemple, si j'ai un arbre représentant les expressions arith pour les entiers et pour les réels???
    Visiteur s'aplique à un Composite normalement, donc tous les objets "visitables" doivent avoir le meme type (ou au minimum, respecter la meme interface). Dans le cas des entier/reel, il faut une interface INombre, ou une classe mère Nombre par exemple.

    est ce que vous pouvez m'aider sur les visiteurs en java??
    Je veux bien essayer ^^

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    je vous remercie pour votre compréhension.

    Pour être plus explicite je vous présente l'exemple suivant:

    j'ai un nœud Exp (expression) avec deux sous nœuds (ou plus ) : add et or.
    Quand je visite 'add' le type retourné doit être par ex entier et quand je visite l'autre nœud( le or) le type doit être: booléen.


    Sincères remerciements

    Katim.

  8. #8
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    Je te propose que, chaque fois, le type retourné soit une instance de la classe Valeur , contenant une chaine de caractère (représentation de la valeur réelle) et une des valeurs du type énuméré TypeValeur.

    L'enumération TypeValeur contient, entres autres, Bool, Int, String, Date ....

    Lors de l'interprétation d'une valeur, quelle qu'elle soit, tu regarde son TypeValeur. En fonction, tu parses la chaine de caractère de la bonne manière, ce qui te permet de récupérer la valeur dans son bon type (bool ou int)

    Pour cela, Valeur peut posséder diverses méthodes de type "boolean GetAsBool()" , "int GetAsInt()" . Ces méthodes renvoie une erreur si l'instance n'est pas dans le TypeValeur correspondant, sinon ils renvoie la chaine parsée.

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    merci pour la proposition. j'ai écrit une classe valeur qui contient : val, et T de type: typevaleur.

    Pour:
    le type retourné soit une instance de la classe Valeur
    je ne peux pas passer une instance comme un argument ( car pour la syntaxe du visiteur en java je dois passer le type comme paramètre).

    j'ai essayé de définir une instance de cette classe (en utilisant la notion de constructeur) , soit R.
    Puis , j'ai utilisé R.T comme le type retourné par le visiteur, mais ça ne marche pas.

    j'aimerais savoir comment puis je utiliser les méthodes getAsInt,...,


    Merci.
    Katim.

  10. #10
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    j'ai écrit une classe valeur qui contient : val, et T de type: typevaleur.
    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class TypeValeur
    {
    // blabla
    }
    public class Valeur
    {
      // TypeValeur T
      // String val;
     
      public int getAsInt() { return Int.Parse(val); }
      public bool getAsbool() { return Bool.Parse(val); }
    }
    je ne peux pas passer une instance comme un argument
    Donc, passer le type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public class Core implements Exp.Visitor <Valeur,Arbre>
    j'aimerais savoir comment puis je utiliser les méthodes getAsInt
    Ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Valeur v = // initialisation;
    int i ;
    bool b;
    if( v.Type == TypeValeur.Int)
      i = v.GetAsInt();
    else
      b = v.GetAsBool();

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    j'aimerais tester votre proposition, mais j'ai un problème avec la méthode Parse. J'ai trouvé
    "..pour analyser une chaine représentant une date, nous utilisons la méthode parse() de la classe DateFormat. Il en résulte un objet Date."
    Même, j'aimerais savoir pourquoi vous avez déclaré TypeValeur comme une classe à part.

    Merci.
    Katim.

  12. #12
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    j'ai un problème avec la méthode Parse
    Voir les divers tuto, aides et forum java, mes souvenirs de java sont loins

    j'aimerais savoir pourquoi vous avez déclaré TypeValeur comme une classe à part
    Je suis allé trop vite, c'est une enum et non une classe. Quoiqu'il est possible d'en faire une classe; mais jen'en voit pas trop l'interet.

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    je m'excuse pour le retard, (pb de santé).

    pour la classe , j'ai essayé d'écrire une classe abstraite, avec des méthodes qui test le type de la valeur (par exemple: isint(),...).

    je vais lessayer, et je vais vous contacter

    Sincère remerciement.

    Katim.

Discussions similaires

  1. Utilisation du Designe pattern command
    Par menzlitsh dans le forum Frameworks Web
    Réponses: 1
    Dernier message: 07/02/2009, 11h19
  2. Utiliser un design pattern
    Par tuxmat dans le forum Design Patterns
    Réponses: 6
    Dernier message: 18/08/2008, 21h06
  3. Réponses: 6
    Dernier message: 29/06/2007, 12h43
  4. Réponses: 6
    Dernier message: 03/05/2007, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo