boost spirit file iterator



  • Hallo
    Ich hab mir mit spirit ein paar rules erstellt:

    rule<> grammar =
    		spaces >>
    		str_p("Pet") >> spaces >> ch_p('(') >> spaces >>
    		named_value >> spaces >>
    		+(ch_p(',') >> spaces >> *(pet_value) >> *(named_value) >> spaces) >>
    		str_p(");") >> 
    		spaces >>
    		end_p;
    

    mit const char * funktioniert das sehr gut
    nur möchte ich das jetzt mit einem file iterator verwenden.
    und das funktioniert überhaupt nicht :(.

    typedef file_iterator<char>   iterator_t;
    
    iterator_t first("pets");
    
        if (!first)
        {
           std::cout << "Unable to open file!\n";
    
           // Clean up, throw an exception, whatever
           return -1;
        }
    
        iterator_t last = first.make_end();
    
    // hier der parser zu der obigen rule
    
    parse_info<iterator_t> result = parse(first, last, grammar);
    

    weiß irgend jemand warum das nicht funktioniert.

    lg
    Verucca



  • Spirit hat so seine Probleme mit reinen Input-Iteratoren (vor allem mit der Tatsache, daß sie laut Standard nicht zuverlässig kopiert werden können), deshalb haben die Erfinder noch einen multi_pass_iterator<> mitgeliefert, den du um deinen Stream-Iterator wrappen kannst.



  • Danke - werde ich mir nachher anschauen ....

    jedenfalls brauch ich noch etwas anderes.
    ich lese momentan die datei einfach in einen string ein ( weil mit dem file iterator nicht geklapt hat 🙂 ).
    dann parse ich das mit meinem parser.

    ich will jetzt mehrere stringbilder und informationen in eine klasse parsen.
    jedesmal wenn ein bild eingelesen wurde, möchte ich das in einen vector<strinbild> einfügen und dann ein neues stringbild einlesen.

    allerdings weiß ich nicht genau wie ich ein neues stringbild erstelle.

    rule<> grammar = repeat_p(1,more)[
    		(spaces >>
    		str_p("Pet") >> spaces >> ch_p('(') >> spaces >>
    		named_value >> spaces >>
    		+(ch_p(',') >> spaces >> (*(pet_value) || *(named_value)) >> spaces) >>
    		str_p(");") >> 
    		spaces) [push_back_a(petsvect, pet), Pet pet]] >>
    		end_p;
    

    das hier:

    [push_back_a(petsvect, pet), Pet pet]]
    

    ist natürlich unsinn.

    aber die frage ist wie erstelle ich ein neues pet ( stringbild ).
    wenn die loop durch gelaufen ist.
    das push_back funktioniert ja gut, aber ein neues strinbild erstellen und dann wieder pushen geht nicht wirklich - bzw. weiß ich nicht wie.

    lg
    Verucca



  • also die einzige methode wie ich das jetzt hin bekommen hab ist alles zu klammern und jeweils immer nur eine aktion durchzuführen

    (( parser) [aktion]) [aktion]

    mehrere aktionen hinter einander hat er nicht genommen 😞 .....
    lg
    Verucca



  • ich weis nicht, was ein "stringbild" sein soll, geschweige denn wie der constructor aussieht, aber vielleicht ist das ja, was du meintest. such mal unter phoenix in der spirit docu für mehr infos.

    phoenix::push_back(var(petsvec),phoenix::construct_<Pet>(phoenix::arg1,phoenix::arg2))
    

    und formatiere das ganze bitte ein wenig besser, ich hab jetzt fast 5 mins gebraucht, bis ich kapiert hab, was nun alles geparsed wird 😉


Log in to reply