2013-01-14 2 views
2

Je veux analyser un nombre à virgule flottante dans un fichier texte et l'insérer dans une table de symboles; l'analyseur et la table de symboles sont fournis par spirit :: qi.Utiliser boost :: phoenix :: bind avec boost :: spirit :: qi :: symbols :: add

Voici mon code:

#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/include/phoenix.hpp> 

#include <stdint.h> 
#include <iostream> 
#include <string> 
template<typename VTYPE> 
struct VTable : boost::spirit::qi::symbols<char, VTYPE> { 
    VTable() {} // empty 
}; 

int main() { 
using boost::spirit::qi::_1; 
using boost::spirit::qi::eps; 
using boost::spirit::qi::rule; 
using boost::spirit::qi::ascii::space; 
using boost::spirit::qi::space_type; 
using boost::spirit::qi::real_parser; 
using boost::spirit::qi::int_parser; 
using boost::spirit::qi::strict_real_policies; 
    VTable<double> floatDecs; 
    floatDecs.add("hallo", 15.26)("duDa", 18.5); 

const std::string some = "some"; 
    rule<std::string::iterator, double> value = real_parser<double, strict_real_policies<double>>() [ boost::phoenix::bind(&VTable<double>::add, floatDecs, boost::phoenix::cref(some), _1) ]; 

    std::cout << boost::spirit::qi::phrase_parse(test.begin(), test.end(), value, space); 
    return 0; 
} 

Le problème réside ici dans boost :: bind de Phoenix, mais je ne sais pas, comment résoudre ce problème (je suis assez nouveau à cette bibliothèque).

+0

duplication possible de [Comment ajouter des symboles qi :: dans la grammaire ?] (Http://stackoverflow.com/questions/8780604/how-to-add-qisymbols-in-grammariterator- double) – sehe

+1

@sehe l'expression de liaison dans cette réponse est beaucoup moins effrayante que la mienne: p. –

+0

Voulez-vous vraiment dire que [] est un tableau? Cela ne me semble pas comme si cela va compiler – FatalFlaw

Répondre

3

Voici une version de travail. Après, je vais énumérer ce qui n'allait pas avec le vôtre.

#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/include/phoenix.hpp> 

#include <stdint.h> 
#include <iostream> 
#include <string> 
template<typename VTYPE> 
struct VTable : boost::spirit::qi::symbols<char, VTYPE> { 
    VTable() {} // empty 
}; 

int main() { 
using boost::spirit::qi::_1; 
using boost::spirit::qi::eps; 
using boost::spirit::qi::rule; 
using boost::spirit::qi::ascii::space; 
using boost::spirit::qi::space_type; 
using boost::spirit::qi::real_parser; 
using boost::spirit::qi::int_parser; 
using boost::spirit::qi::strict_real_policies; 

    VTable<double> floatDecs; 
    floatDecs.add("hallo", 15.26)("duDa", 18.5); 

    const char some[] = "some"; 

    rule<std::string::iterator, double()> value = 
      real_parser<double, strict_real_policies<double> >() 
      [ boost::phoenix::bind(floatDecs.add, boost::phoenix::val(some), _1) ]; 

    std::string test("10.6"); 

    std::string::iterator b(test.begin()), e(test.end()); 

    std::cout << boost::spirit::qi::phrase_parse(b, e, value, space); 

    return 0; 
} 

D'abord, la variable que vous voulez utiliser comme argument à ajouter() doit être corrigée.

const char some[] = "some"; 

Ensuite, vous devez corriger la syntaxe dans vos paramètres de modèle de règle:

rule<std::string::iterator, double()> 

Notez les parenthèses, pour faire la double déclaration de foncteur plutôt qu'une vanille double, pour une évaluation paresseuse.

Ensuite, vous devez utiliser la syntaxe ci-dessus pour votre action sémantique.

[ boost::phoenix::bind(floatDecs.add, boost::phoenix::val(some), _1) ]; 

Honnêtement, je ne sais pas pourquoi cela fonctionne comme je ne suis pas un expert de phénix, mais le lien dans le commentaire « années sehe » ci-dessus a fourni la réponse. En outre, vous étiez aboyer le mauvais arbre avec cref, il n'y a aucune indication de la déclaration de add() qu'une référence est ce qui est requis. val est ce dont vous avez besoin pour transformer la variable some en un argument paresseux phénix-heureux. Enfin, il vous suffit de fournir quelques données de test raisonnables.

Le code ci-dessus devrait fonctionner pour vous maintenant.

Questions connexes