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 | grammaire simple qui ne compile pas .


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 Boost::spirit | grammaire simple qui ne compile pas .
    Bonjour, j'essaye en ce moment d'apprendre à utiliser boost::spirit et je me suis imposé en lisant la doc un petit exercice, récuperer l'extension d'un nom de fichier.
    Par exemple "toto.jpg" son extension est jpg .
    Voici le code complet de ma grammaire spirit :
    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
    #include <boost/config/warning_disable.hpp>
    #include <iostream>
    #include <boost/spirit/include/qi.hpp>
    #include <boost/spirit/include/phoenix_operator.hpp>
    namespace qi = boost::spirit::qi;
    namespace ascii = boost::spirit::ascii;
     
    struct extension : qi::grammar<std::string::const_iterator, std::string(), ascii::space_type>
    {
    	extension() : extension::base_type(start)
    	{
    		using ascii::char_;
    		start = *(char_ - '.') >> '.' >> *(char_[qi::_val += qi::_1]);
    	}
    	qi::rule<std::string::const_iterator, std::string(), ascii::space_type> start;
    };
     
    int main()
    {
    	std::string test("test.ext");
    	extension grammaire;
    	std::string resultat;
     
    	qi::phrase_parse(test.begin(), test.end(), grammaire, ascii::space, resultat);
            std::cout << resultat << std::endl;
            return 0;
    }
    Voila l'erreur de compilation (je dois avouer que je la trouve ... imbitable ) :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    In file included from /usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:35:0,
                     from /usr/include/boost/spirit/home/qi/nonterminal.hpp:14,
                     from /usr/include/boost/spirit/home/qi.hpp:20,
                     from /usr/include/boost/spirit/include/qi.hpp:16,
                     from /home/theodor/Programme/BBEngine/src/BBEngine/MeshParser.cpp:3:
    /usr/include/boost/spirit/home/qi/reference.hpp: In instantiation of ‘bool boost::spirit::qi::reference<Subject>::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; Context = boost::spirit::context<boost::fusion::cons<std::basic_string<char>&, boost::fusion::nil>, boost::spirit::locals<> >; Skipper = boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >; Attribute = std::basic_string<char>; Subject = const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type>]’:
    /usr/include/boost/spirit/home/qi/parse.hpp:164:9:   required from ‘bool boost::spirit::qi::phrase_parse(Iterator&, Iterator, const Expr&, const Skipper&, boost::spirit::qi::skip_flag::enum_type, Attr&) [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; Expr = extension; Skipper = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l>; Attr = std::basic_string<char>]’
    /usr/include/boost/spirit/home/qi/parse.hpp:210:86:   required from ‘bool boost::spirit::qi::phrase_parse(const Iterator&, Iterator, const Expr&, const Skipper&, Attr&) [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; Expr = extension; Skipper = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l>; Attr = std::basic_string<char>]’
    /home/theodor/Programme/BBEngine/src/BBEngine/MeshParser.cpp:24:78:   required from here
    /usr/include/boost/spirit/home/qi/reference.hpp:43:71: erreur: no matching function for call to ‘boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type>::parse(__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, const __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, boost::spirit::context<boost::fusion::cons<std::basic_string<char>&, boost::fusion::nil>, boost::spirit::locals<> >&, const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >&, std::basic_string<char>&) const’
    /usr/include/boost/spirit/home/qi/reference.hpp:43:71: note: candidates are:
    In file included from /usr/include/boost/spirit/home/qi/nonterminal.hpp:14:0,
                     from /usr/include/boost/spirit/home/qi.hpp:20,
                     from /usr/include/boost/spirit/include/qi.hpp:16,
                     from /home/theodor/Programme/BBEngine/src/BBEngine/MeshParser.cpp:3:
    /usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:273:14: note: template<class Context, class Skipper, class Attribute> bool boost::spirit::qi::rule::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Context = Context; Skipper = Skipper; Attribute = Attribute; Iterator = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >; T1 = std::basic_string<char>(); T2 = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l>; T3 = boost::spirit::unused_type; T4 = boost::spirit::unused_type]
    /usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:273:14: note:   template argument deduction/substitution failed:
    In file included from /usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:35:0,
                     from /usr/include/boost/spirit/home/qi/nonterminal.hpp:14,
                     from /usr/include/boost/spirit/home/qi.hpp:20,
                     from /usr/include/boost/spirit/include/qi.hpp:16,
                     from /home/theodor/Programme/BBEngine/src/BBEngine/MeshParser.cpp:3:
    /usr/include/boost/spirit/home/qi/reference.hpp:43:71: note:   cannot convert ‘first’ (type ‘__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >’) to type ‘__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >&’
    In file included from /usr/include/boost/spirit/home/qi/nonterminal.hpp:14:0,
                     from /usr/include/boost/spirit/home/qi.hpp:20,
                     from /usr/include/boost/spirit/include/qi.hpp:16,
                     from /home/theodor/Programme/BBEngine/src/BBEngine/MeshParser.cpp:3:
    /usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:319:14: note: template<class Context, class Skipper, class Attribute, class Params> bool boost::spirit::qi::rule::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&, const Params&) const [with Context = Context; Skipper = Skipper; Attribute = Attribute; Params = Params; Iterator = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >; T1 = std::basic_string<char>(); T2 = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l>; T3 = boost::spirit::unused_type; T4 = boost::spirit::unused_type]
    /usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:319:14: note:   template argument deduction/substitution failed:
    In file included from /usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:35:0,
                     from /usr/include/boost/spirit/home/qi/nonterminal.hpp:14,
                     from /usr/include/boost/spirit/home/qi.hpp:20,
                     from /usr/include/boost/spirit/include/qi.hpp:16,
                     from /home/theodor/Programme/BBEngine/src/BBEngine/MeshParser.cpp:3:
    /usr/include/boost/spirit/home/qi/reference.hpp:43:71: note:   cannot convert ‘first’ (type ‘__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >’) to type ‘__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >&’
    make[2]: *** [CMakeFiles/bin/bin.dir/src/BBEngine/MeshParser.cpp.o] Erreur 1
    make[1]: *** [CMakeFiles/bin/bin.dir/all] Erreur 2
    make: *** [all] Erreur 2
     
    le shell a retourné 2
    Malheureusement je ne sais pas quoi faire maintenant, je ne crois pas m'être trompé dans la grammaire ou dans les espaces de noms, et je crois que le problème se situe sur la ligne ou j'appelle phrase_parse.

    J'espere que vous pourrez m'aider, merci de m'avoir lu !

  2. #2
    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,

    cannot convert ‘first’ (type ‘__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >’) to type ‘__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >&’
    Ça ressemble beaucoup à un problème de constness, non ? Cannot convert normal_iterator<char*,...> to normal_iterator<const char*,...>

    Essaye de remplacer tous les std::string::const_iterator par des std::string::iterator

    Ça me semble d'autant plus probable que spirit dans la fonction phrase_parse incrémente l'itérateur passé en premier paramètre pour le faire pointer à l'endroit où le parsing s'est arrêté (en cas d’échec, quelque part au milieu de la string, en cas de réussite à la fin de la string).

    C'est à dire que si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::string::iterator it = test.begin();
    std::string::iterator end = test.end();
    qi::phrase_parse(it, end, grammaire, ascii::space, resultat);
            std::cout << resultat << std::endl;
    Alors si le parsing a réussi tu as (it == end) en sorti de phrase_parse(). "it" doit donc être modifiable et ne peut pas être un const_iterator.

  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
    Merci beaucoup, j'ai bêtement copié des bouts de codes sans réfléchir, je n'ai que ce que je mérite.
    Maintenant ca marche à merveille, merci !

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

Discussions similaires

  1. sscanf - syntaxe qui ne compile pas
    Par xilebo dans le forum C
    Réponses: 4
    Dernier message: 12/09/2006, 13h41
  2. suivi de session simple qui ne marche pas
    Par mikebranque dans le forum Langage
    Réponses: 6
    Dernier message: 02/06/2006, 16h55
  3. [C# 2.0] Un exemple de classe générique qui ne compile pas.
    Par Pierre8r dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/05/2006, 11h11
  4. Réponses: 5
    Dernier message: 18/05/2006, 12h06
  5. Programme Perl tout simple qui ne fonctionne pas
    Par jejerome dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2006, 23h58

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