Automatische Verkettung von Analyseergebnissen zu Vektoren

Ich habe einige Regeln zum Parsen von Floats in zwei std :: -Vektoren von Floats geschrieben, die wiederum in einer Struktur gespeichert sind:

Dateneingabe:

#
# object name01
#

v  -1.5701 33.8087 0.3592
v  -24.0119 0.0050 21.7439
# a comment

vn 0.0000 0.5346 0.8451
vn 0.8331 0.5531 -0.0000
# another comment

Struktur:

struct ObjParseData
{
    ObjParseData() : verts(), norms() {}

    std::vector<float> verts;
    std::vector<float> norms;
};

Und der relevante Parsing-Code:

struct objGram : qi::grammar<std::string::const_iterator, ObjParseData(), iso8859::space_type>
    {
        objGram() : objGram::base_type(start)
        {
            vertex  = 'v' >> qi::double_ >> qi::double_ >> qi::double_;
            normal  = "vn" >> qi::double_ >> qi::double_ >> qi::double_;
            comment = '#' >> qi::skip(qi::blank)[ *(qi::print) ];
            vertexList = *(vertex | comment);
            normalList = *(normal | comment);
            start = vertexList >> normalList;
        }

        qi::rule<std::string::const_iterator, ObjParseData(), iso8859::space_type> start;
        qi::rule<std::string::const_iterator, std::vector<float>(), iso8859::space_type> vertexList;
        qi::rule<std::string::const_iterator, std::vector<float>(), iso8859::space_type> normalList;
        qi::rule<std::string::const_iterator, std::vector<float>(), iso8859::space_type> vertex;
        qi::rule<std::string::const_iterator, std::vector<float>(), iso8859::space_type> normal;
        qi::rule<std::string::const_iterator, iso8859::space_type> comment;
    } objGrammar;


    ObjParseData resultData;

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

Und das funktioniert. Es analysiert alle Floats, denen 'v' vorangestellt ist, in den Vert-Vektor der Struktur und alle Floats, denen "vn" vorangestellt ist, in Normen. Das ist toll, aber ich weiß nicht genau, warum das so ist.

Wenn ich das richtig verstehe, fügt eine wie folgt definierte Regel alle ihre Ergebnisse in einen std :: -Vektor von floats ein.

qi::rule<std::string::const_iterator, std::vector<float>(), iso8859::space_type> vertex;

Wenn Sie also den oben gezeigten Parsing-Code betrachten und wissen, dass eine Regel wie Vertex in einen std :: -Vektor von Floats zerlegt wird, verkettet anscheinend eine Regel wie vertexList (die oben gezeigte) die Ergebnisse von Vertex in einen std :: -Vektor von Floats ? Wenn Sie dieses Verhalten sehen, denken Sie, Sie könnten diese beiden Regeln (vertex und vertexList) einfach als eine schreiben, aber leider funktioniert dies nicht:

vertex  = *('v' >> qi::double_ >> qi::double_ >> qi::double_) | comment;
normal  = *("vn" >> qi::double_ >> qi::double_ >> qi::double_) | comment;
comment = '#' >> qi::skip(qi::blank)[ *(qi::print) ];
start = vertex >> normal;

Der Code wird kompiliert und qi :: phrase_parse gibt eine erfolgreiche Analyse zurück, aber die std :: -Vektoren in der Struktur werden nicht mehr gefüllt. Was fehlt hier?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage