auto concatenación de resultados de análisis en vectores
He escrito algunas reglas para analizar flotadores en dos std :: vector's de flotadores, que a su vez se almacenan en una estructura:
Entrada de datos:
#
# 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
Struct:
struct ObjParseData
{
ObjParseData() : verts(), norms() {}
std::vector<float> verts;
std::vector<float> norms;
};
Y el código de análisis relevante:
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 );
Y esto funciona. Analiza todos los flotadores precedidos por 'v' en el vector verts de la estructura y todos los flotadores precedidos por "vn" en normas. Lo cual es genial, pero realmente no sé por qué funciona esto.
Ahora bien, si entiendo esto correctamente, una regla definida a continuación pone todos sus resultados en un std :: vector de flotadores.
qi::rule<std::string::const_iterator, std::vector<float>(), iso8859::space_type> vertex;
Entonces, mirando el código de análisis que se muestra arriba y sabiendo que una regla como vértice se analiza en un std :: vector de flotadores, aparentemente una regla como vertexList (la que se muestra arriba) concatena los resultados del vértice en un std :: vector de flotadores ? Entonces, viendo este comportamiento, pensarías que podrías escribir esas dos reglas (vértice y vertexList) como una, pero desafortunadamente esto no funciona:
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;
El código se compila y qi :: phrase_parse devuelve un análisis exitoso, pero el archivo std :: vector en la estructura ya no está lleno ... ¿Qué me estoy perdiendo aquí?