boost spirit qi + phoenix + locals



  • Ich habe ein bisschen schwierigkeiten mit boost phoenix in boost spirit qi Grammatiken / Symantischen Ausdrücken.

    Ich versuche Memberfunctionpointer aus einer map mit dem synthesized attribute "_val" zu binden um damit Seiteneffekte auszulösen.
    Allerdings kompiliert folgendes nicht.

    Eine Grammatik soll folgendes beinhalten:

    // grammar Klasse
    // initialisiere die map container mit den string <-> Funktionszeiger Paaren
    
    // ...
    
    // Im Konstruktor der Grammatik:
    qualifiers =
        eps [_val = _r1] >>  // übernehme bisherigen TypeWrapper und verändere den (Seitenfrage: Gibt es sowas wie pass by reference in rules?)
        *(
            qual // parse sowas wie "const, static, volatile" und gib den string zurück
            [
                // PROBLEM HERE !!!:
                // ich würde ja eigentlich ganz gern an den eigentlich Wert,
                // der sich hinter _1 versteckt, aber das scheint nach meiner recherche
                // nicht so einfach zu gehen.
                // Vorher hatte ich einen Workaround mit einer Membervariable der Grammatik
                // Aber das finde ich absolut hässlich.
                // Ich will aber auch nicht die lazy function binden, sondern den fptr
                // ich hatte auch sowas wie 
                // phoenix::bind(phoenix::bind(&std::map</*...*/>::at, qualifier_neg_getters, _1), _val) 
                // ausprobiert.
                // leider sind das auch keine einfachen phx::val, die man aufrufen könnte um den Wert zu bekommen
                // mir gehen die Ideen aus
                if_(phoenix::bind(phoenix::at(qualifier_neg_getters, _1), _val))   // prüfe ob qualifier von "TypeWrapper" auf false
                [
                    phoenix::bind(phoenix::at(qualifier_setters, _1), _val, true)   // setze qualifier von "TypeWrapper" auf true
                ]
                .else_
                [
                    _pass = false // qualifier wurde schon geparst (= ist auf true)! -> nicht gültig
                ]
            ]
        )
    ;
    
    start =
        qualifiers(_val)    [_val = _1] // parse "const", "volatile", "static", "auto", "register"
    // ... noch im Aufbau befindlich
    ;
    
    // end of constructor 
    // ...
    
    /// RULES
    qi::rule <iterator_type, TypeWrapper(TypeWrapper), ascii::space_type> qualifiers;
    qi::rule <iterator_type, TypeWrapper(), ascii::space_type, qi::locals <TypeWrapper> > start;
    
    /// SYMBOLS
    type_qualifiers qual;
    
    /// MEMBERS
    std::map <std::string, void (TypeWrapper::*)(bool)> qualifier_setters;
    std::map <std::string, bool (TypeWrapper::*)() const> qualifier_neg_getters;
    
    // end of grammar class
    

    Ist das Problem oder mein Ziel ersichtlich?


Log in to reply