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 !