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
    als Skipper den Typ boost::fusion::unused_type
    und
    als Attribute Type den const 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 , statt parse_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 , statt parse_phrase genutzt worden.

    Da hab ich einen Fehler gemacht. Sobald ein Skipper im Spiel ist, muß immer phrase_parse() verwendet werden, ansonsten parse() . Siehe hier: http://www.boost.org/doc/libs/1_44_0/libs/spirit/doc/html/spirit/qi/reference/parse_api/iterator_api.html

    HTH
    Regards Hartmut



  • Herzlichsten Dank Hartmut!

    Frage ist beantwortet 🙂


Anmelden zum Antworten