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 :

Boost Spirit X3: syntaxe incorrecte pour BOOST_SPIRIT_DEFINE


Sujet :

Boost C++

  1. #1
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut Boost Spirit X3: syntaxe incorrecte pour BOOST_SPIRIT_DEFINE
    Salut!
    J'essaie de definir une grammaire sur un arbre, mais j'ai un souci avec la syntaxe de BOOST_SPIRIT_DEFINE.
    En gros, de ce que j'ai compris de la bilbiotheque, je dois utiliser BOOST_SPIRIT_DEFINE pour les regles qui sont recursives.

    J'ai essaye quelques variantes du code suivant (j'ai du mal a suivre les evolutions de la syntaxe a travers les presentations/tutos etc, mais je me base sur https://godbolt.org/ ), mais il refuse de compiler, avec l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    error: expected expression
      BOOST_SPIRIT_DEFINE(branch, branch_set);
      ^
    /include/boost/spirit/home/x3/nonterminal/rule.hpp:247:5: note: expanded from macro 'BOOST_SPIRIT_DEFINE'
        BOOST_SPIRIT_DEFINE_, _, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))             \
        ^
    1 error generated.
    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
    21
    22
     
      std::string input="(,,(,));" ;
     
      auto iter = input.begin();
      auto iter_end = input.end();
     
      // Grammar
     
      rule<struct branch> branch{"branch"};
      rule<struct branch_set> branch_set{"branch_set"};
     
      auto name    = alpha >> *alnum;
      auto length  = ':' > double_;
      auto leaf    = -name;
      auto internal= '(' >> branch_set >> ')' >> -name;
      auto subtree = leaf | internal;
      auto tree    = subtree >> ";";
     
      auto const branch_def = subtree >> length;
      auto const branch_set_def = branch | branch >> ',' >> branch_set;
     
      BOOST_SPIRIT_DEFINE(branch, branch_set);

  2. #2
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut
    Oups en fait x3::rule doit etre defini dans le scope du namespace!
    Du coup ca compile (mais bon evidemment le parsing ne marche pas - encore) !

    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
    21
    22
    23
    24
    25
    26
    27
     
    namespace quetzal::newick::parser
    {
      namespace x3 = boost::spirit::x3;
     
      using x3::alpha;
      using x3::alnum;
      using x3::double_;
      using x3::rule;
      using x3::phrase_parse;
      using x3::space;
     
      rule<struct branch> branch{"branch"};
      rule<struct branch_set> branch_set{"branch_set"};
     
      auto name    = alpha >> *alnum;
      auto length  = ':' > double_;
      auto leaf    = -name;
      auto internal= '(' >> branch_set >> ')' >> -name;
      auto subtree = leaf | internal;
      auto tree    = subtree >> ';';
     
      auto const branch_def = subtree >> length;
      auto const branch_set_def = branch | branch >> ',' >> branch_set;
     
      BOOST_SPIRIT_DEFINE(branch, branch_set);
    }

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/11/2015, 15h20
  2. Boost Spirit: Grammaire pour les équations en math
    Par darkman19320 dans le forum C++
    Réponses: 3
    Dernier message: 17/04/2012, 18h30
  3. [bash] syntaxe incorrecte pour paramètre de md5sum
    Par AnozerOne dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 17/06/2011, 09h15
  4. Boost::Spirit - Parser pour listes énumérées
    Par pbartolo dans le forum Boost
    Réponses: 2
    Dernier message: 05/11/2009, 10h39
  5. Réponses: 3
    Dernier message: 30/05/2008, 10h59

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