парсинг на несколько членов вектора

Я хочу рекурсивно разобрать строку и сохранить результаты в одной структуре. Я'Мы написали парсер, который может обрабатывать одну итерацию. Ввод отформатирован следующим образом:

v  1.5 2.0 2.5
v  3.0 3.5 4.0
f 1 2 3
f 4 5 6 
v  4.5 5.0 5.5
v  6.0 6.5 7.0
f 7 8 9
f 10 11 12

Проблема в том, что он анализирует только первые 4 строки, останавливается на третьей встреченной букве 'v', Полный код приведен ниже. Как мне изменить этот код, чтобы он также анализировал остальную часть ввода в той же структуре? Я'мы пытались изменить правило запуска изstart = vertex >> elements вstart = *(vertex >> elements), но это только дает огромную ошибку компиляции. То же самое касаетсяstart = +(vertex >> elements), Есть идеи, как мне изменить правила?

#include 
#include 
#include 

#include "boost/spirit/include/qi.hpp"
#include "boost/spirit/include/support_iso8859_1.hpp"
#include "boost/fusion/include/adapt_struct.hpp"


struct ElemParseData
{
    std::vector verts;
    std::vector idx;
};

BOOST_FUSION_ADAPT_STRUCT(
    ElemParseData,
    (std::vector, verts)
    (std::vector, idx)
)


bool doParse( ElemParseData &parseData, const std::string &data )
{
    namespace qi      = boost::spirit::qi;
    namespace iso8859 = boost::spirit::iso8859_1;

    struct objGram : qi::grammar
    {
        objGram() : objGram::base_type(start)
        {
            vertex   = *('v' >> qi::double_ >> qi::double_ >> qi::double_);
            elements = *('f' >> qi::int_ >> qi::int_ >> qi::int_);

            start = vertex >> elements;
        }

        qi::rule start;
        qi::rule vertex;
        qi::rule elements;

    } objGrammar;

    std::string::const_iterator f = data.cbegin();
    bool res = qi::phrase_parse( f, data.cend(), objGrammar, iso8859::space, parseData );


    // print everything that hasn't been processed by the parser
    std::cout < "#### Trail ####" < std::endl;
    std::cout < std::string(f, data.cend()) < std::endl;

    return res;
}


int main( int argc, char* argv[] )
{
    std::stringstream ss;
    std::filebuf fb;
    if ( fb.open("parsetest.txt", std::ios::in) )
    {
        std::istream is(&fb);
        while (is)
            ss < char(is.get());
        fb.close();
    }


    ElemParseData parseData;
    bool res = doParse( parseData, ss.str() );


    // print results
    std::cout < std::endl < "Parsing result: " < res < std::endl;
    std::cout < "---######### ResultData #########---" < std::endl;
    std::cout < "---- Begin vertex data ----" < std::endl;
    std::vector

Ответы на вопрос(1)

Ваш ответ на вопрос