Boost.Spirit.Qi Maximale Länge von Folgen konfigurieren



  • Der folgende Code kompiliert nicht unter msvc 10:

    #include <boost/spirit/include/qi.hpp>
    #include <boost/spirit/include/phoenix.hpp>
    
    int main()
    {
        using namespace boost::spirit::qi;
    
        rule<std::string::iterator> foobar;
    
        // 11 Mal int_:
        foobar
            =   int_ >> int_ >> int_ >> int_ >> int_ >> int_ >> int_ >> int_ >> int_ >> int_ >> int_
            ;
    
        return 0;
    }
    

    Setze ich nur 10 Mal int_ in Folge, kompiliert es.
    Ich kann leider nicht qi::repeat benutzen, da meine Grammatik natürlich etwas komplizierter ist, als sie hier dargestellt wird.
    Die Frage ist also, ob und wie ich die maximale Länge von >>-Folgen konfigurieren kann. In der Dokumentation konnte ich leider nichts über Makros wie FUSION_MAX_VECTOR_SIZE finden.

    Hat jemand eine Idee?



  • Ich vermute mal, dass bei MSVC nur Templates mit bis zu 10 Argumenten spezialisiert wurden, weil MSVC keine Variadic Templates kann. Lösen kann man das nur, indem man sie selbst hinzufügt. Frag mich aber nicht wie, in der Doku findest du bestimmt etwas dazu.



  • Das ist es ja. Ich kann eben nichts dazu in den Docs finden 😕
    Ich würde eher vermuten, es werden Preprocessor Makros benutzt... man müsste nur wissen welche...



  • Probiers mal mit FUSION_MAX_VECTOR_SIZE .



  • Hast du ja selber herausgefunden?
    Warum machst du dann nicht einfach

    #define FUSION_MAX_VECTOR_SIZE 20
    

    vor den anderen includes?



  • Das habe ich bereits... Das funktioniert nicht. Leider.
    Spirit baut auf Proto auf, und proto verwendet preprocessor-metaprogramming, um die Kompilierzeiten zu reduzieren.



  • Dann fällt mir nicht ein, an was das liegen könnte. Jedenfalls ist es nicht das, was Pi vermutet hat. g++ kompilliert deinen Code auch ohne c++0x, wenn man FUSION_MAX_VECTOR_SIZE entsprechend definiert. Ohne kompilliert's nicht.

    Was bekommst du für eine Fehlermeldung?



  • versuch mal das gleiche mit SPIRIT_ARGUMENTS_LIMIT, SPIRIT_ATTRIBUTES_LIMIT. Bissle surfen durch die Header bringt dich vielleicht voran 😉


Anmelden zum Antworten