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

C++ Discussion :

Design d'un parseur


Sujet :

C++

  1. #1
    b4u
    b4u est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Par défaut Design d'un parseur
    Bonsoir!

    Je suis souvent confronté au même problème lorsque j'écris un parseur de texte. Là pour le coup, les éléments à traiter sont des chaines de caractères de la forme "cle=valeur", et ça me parait donc naturel d'utiliser le type std::map avec le design suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <string>
    #include <map>
     
     
    class   MyClass
    {
    private:
       typedef bool (MyClass::t_callback*)(const std::string &data);
     
    public:
       bool      Parse(const std::string &input);
     
    private:
       bool      store_toto(const std::string &data);
       bool      store_tata(const std::string &data);
       bool      store_keke(const std::string &data);
     
    private:
       std::map<std::string, t_callback>   _lookup;
    };
    Ensuite j'initialise le contenu de _lookup dans le constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MyClass::MyClass()
    {
       _lookup["toto"] = &MyClass::store_toto;
       _lookup["tata"] = &MyClass::store_tata;
       _lookup["keke"] = &MyClass::store_keke;
    }
    Comme ça dans la méthode Parse() tout est déja prêt pour sauter vers la bonne fonction selon la clé trouvée. Mais ça m'embête sur plusieurs points:
    - _lookup est recréé & re-rempli à chaque instantiation
    - chaque méthode store_machin() fait souvent une seule ligne, je trouve que c'est bourrin... mais en même temps je veux éviter les montagnes de if - else if au moment de parser

    Il y a une solution plus propre que ça?
    Merci

  2. #2
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Si tu écris souvent des parseurs, je te conseille de jeter un oeil sur spirit. C'est un framework qui permet de générer des parseurs LL. Il me semble même qu'il y a un exemple pour les grammaires du genre key=value (un parseur de ligne de commande...).

    Bon courage.

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Pour ce genre de choses, il y a carrement boost.program_options
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  2. [power designer et Sybase] trigger
    Par mr_qno dans le forum Sybase
    Réponses: 4
    Dernier message: 12/07/2006, 18h32
  3. Réponses: 3
    Dernier message: 09/02/2003, 01h09
  4. Réponses: 3
    Dernier message: 04/09/2002, 09h42
  5. Désigner une variable avec une variable?
    Par littleman dans le forum Paradox
    Réponses: 4
    Dernier message: 12/08/2002, 11h21

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