Boost spirit und Skipper in Grammatik
-
Hallo Leute,
folgende Frage zu boost spirit Qi Parser: Ich möchte eine Grammatik mit einem Skip-Parser versehen:
#include <boost/config/warning_disable.hpp> #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix.hpp> #include <string> namespace qi = boost::spirit::qi; namespace ascii = boost::spirit::ascii; template <typename Iterator, typename Skipper> class Grammar : public qi::grammar<Iterator, Skipper> { public: Grammar() : Grammar::base_type(point_z_) { using qi::double_; point_z_ = double_ >> double_ >> double_; } qi::rule<Iterator, Skipper> point_z_; }; int main() { typedef std::string::const_iterator iterator_type; typedef Grammar<iterator_type,ascii::space_type> Grammar_t; Grammar_t grammar; std::string str; std::cin >> str; std::string::const_iterator iter = str.begin(); std::string::const_iterator end = str.end(); //do the parsing bool r = qi::parse(iter, end, grammar, ascii::space ); if (r && iter == end) std::cout << "Parsing succeeded\n"; else std::cout << "Parsing failed\n"; return 0; }
Mein Beispiel hier läuft vollstens nach dem Vorbild von http://old.nabble.com/problem-with-comment-skipper-td27834020.html
Punkt (b).Dummerweise bringt dies die gleiche Meldung:
rule.hpp(241) : error C2664: 'bool boost::function4<R,T0,T1,T2,T3>::operator ()(T0,T1,T2,T3) const' : cannot convert parameter 4 from 'const boost::fusion::unused_type' to 'const boost::spirit::qi::char_class<Tag> '
Er scheint
alsSkipper
den Typboost::fusion::unused_type
und
alsAttribute Type
denconst boost::spirit::ascii::space_type
zu stetzen. Es sollte doch aber genau umgekehrt sein.Woran kann das liegen?? Wo hab ich was falsch gemacht?
Grüße.
-
Ka55i0peia schrieb:
//do the parsing bool r = qi::parse(iter, end, grammar, ascii::space );
Woran kann das liegen?? Wo hab ich was falsch gemacht?
Wenn Du einen Skipper beutzt, mußt Du phrase_parse() anstelle von parse() verwenden:
//do the parsing bool r = qi::phrase_parse(iter, end, grammar, ascii::space);
HTH
Regards Hartmut
-
Jetzt bin ich aber baff...
Erstmal VIELEN DANK für die Antwort. So klappts!
Unter http://old.nabble.com/problem-with-comment-skipper-td27834020.html ist in der Antwort auch
parse
, stattparse_phrase
genutzt worden.Was ist der Unterschied der Beiden Funktionen? Was ist wann vorzuziehen?
Edit: Der Link ist ja nen Beitrag von Dir
-
Ka55i0peia schrieb:
Unter http://old.nabble.com/problem-with-comment-skipper-td27834020.html ist in der Antwort auch
parse
, stattparse_phrase
genutzt worden.Da hab ich einen Fehler gemacht. Sobald ein Skipper im Spiel ist, muß immer
phrase_parse()
verwendet werden, ansonstenparse()
. Siehe hier: http://www.boost.org/doc/libs/1_44_0/libs/spirit/doc/html/spirit/qi/reference/parse_api/iterator_api.htmlHTH
Regards Hartmut
-
Herzlichsten Dank Hartmut!
Frage ist beantwortet