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

Boost C++ Discussion :

Remplir des vectors de même type distinctement avec Boost::Spirit


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif Avatar de Sahengette
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 79
    Par défaut Remplir des vectors de même type distinctement avec Boost::Spirit
    Bonjour !

    Je recrée un topic sur un de mes (nombreux) problèmes, celui ci concerne toujours boost::spirit. J'essayes en ce moment de créer une grammaire capable de remplir une structure spéciale contenant plusieurs std::vectors du même type.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct toto
    {
        std::vector<float> A, B, C;
        std::vector<int> D;
    };
    J'aimerais une grammaire qui serait capable, en fonction de ce qu'elle recoit, ajoute à ces tableaux des valeurs de maniere distincte, un truc comme ca en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct grammaire : qi::grammar<std::string::iterator, toto(), ascii::space_type>
    {
        grammaire() : grammaire::base_type(start)
        {
             start = ('A' >> float_[])|('B' >> float_[])|('C' >> float_[])|('D' >> int_[])
        }
        qi::rule<std::string::iterator, toto(), ascii::space_type> start;
     
    };
    Et s'il parse cette entrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    A 45.47
    B 89.3
    C 78.2
    D 1
    D 3
    C 12.8
    Je veux qu'il y ait dans ma structure les quatres vectors avec :
    A qui contient un float qui vaut 45.47
    C qui contient deux floats qui valent 78.2 et 12.8
    etc ...


    Voila, j'espere m'être bien exprimé, merci de m'avoir lu !

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Rebonjour,

    Regardes la doc de spirit un des exemple est un parseur xml et montre la syntax pour remplir un conteneur.

  3. #3
    Membre actif Avatar de Sahengette
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 79
    Par défaut
    Salut, l'exemple de boost explique comment remplir un vector, mais moi j'en ai trois du même type, comment dire à spirit que je veux remplir tel vector A, B ...
    C'est peut etre pas trés clair, dites le moi si vous comprenez pas ce que je veux dire, j'ai pas toujours eu des idées nettes

  4. #4
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,

    Il y a un exemple pour remplir un vector dans le doc de spirit ici :
    http://www.boost.org/doc/libs/1_48_0...d__vector.html

    Un autre truc à garder en tête, c'est que les struct héritant de qi::grammar reste avant tout des struct C++ tout à fait classique (on a tendance à l'oublier, vu la montagne de bizarrerie syntaxique de spirit) donc cette struct peut avoir des données membres, des fonctions membres, des arguments dans le constructeur etc.

    Par exemple dans ce cas on pourrait faire :

    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
    struct grammaire : qi::grammar<std::string::iterator, ascii::space_type>
    {
      grammaire(toto* t) : grammaire::base_type(start), t(t)
      {
          using qi::float_;
          using qi::int_;
          using qi::_1;
     
          start = * (	 
                          ('A' >> float_[phx::push_back(phx::ref(t->A), _1)])
    		     | ('B' >> float_[phx::push_back(phx::ref(t->B), _1)])
    		     | ('C' >> float_[phx::push_back(phx::ref(t->C), _1)])
    		     | ('D' >> int_[phx::push_back(phx::ref(t->D), _1)])
    		  );
        }
     
       qi::rule<std::string::iterator, ascii::space_type> start;
       toto * t;
    };
    et dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
       std::string test = "A 45.47 B 89.3 C 78.2 D 1 D 3 C 12.8";
     
       toto t;
       grammaire g(&t);
       qi::phrase_parse(test.begin(), test.end(), g, ascii::space);
    }

Discussions similaires

  1. Parseur de multiple affectation (avec Boost.Spirit)
    Par Trademark dans le forum Langage
    Réponses: 5
    Dernier message: 16/07/2012, 19h20
  2. Regrouper des champs de même type dans la même table
    Par Marsupilami23 dans le forum Développement
    Réponses: 9
    Dernier message: 15/06/2011, 13h53
  3. Réponses: 11
    Dernier message: 26/11/2008, 20h55
  4. Réponses: 1
    Dernier message: 16/06/2008, 13h19

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