Análisis de cadenas, con Boost Espíritu 2, para llenar de datos definido por el usuario en struct

StackOverflow https://stackoverflow.com/questions/2469861

Pregunta

Estoy usando Boost.Spirit que se distribuyó con Boost-1.42.0 con VS2005. Mi problema es como esto.

He esta cadena que fue delimted por comas. Los 3 primeros campos de ella son cadenas y el resto son números. como este.

String1,String2,String3,12.0,12.1,13.0,13.1,12.4

Mi regla es como esto

qi::rule<string::iterator, qi::skip_type> stringrule = *(char_ - ',')
qi::rule<string::iterator, qi::skip_type> myrule= repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',') ;

Estoy tratando de almacenar los datos en una estructura como esta.

struct MyStruct
{
   vector<string> stringVector ;
   vector<double> doubleVector ;
} ;

MyStruct var ;

Me he envuelto en BOOST_FUSION_ADAPT_STRUCTURE para usarlo con el espíritu.

BOOST_FUSION_ADAPT_STRUCT (MyStruct, (vector<string>, stringVector) (vector<double>, doubleVector))

Mi función de análisis analiza la línea y devuelve verdadero y después

qi::phrase_parse (iterBegin, iterEnd, myrule, boost::spirit::ascii::space, var) ;

Estoy esperando var.stringVector y var.doubleVector estén llenos. pero no es el caso.

¿Qué va mal?

El ejemplo de código se encuentra aquí

Gracias de antemano, Surya

¿Fue útil?

Solución

qi::skip_type no es algo que se puede utilizar un patrón. qi :: skip_type es el tipo de la qi::skip marcador de posición, que es aplicable para la directiva skip[] solamente (para permitir que salta dentro de una lexeme[] o para cambiar el patrón en uso) y que no es un componente de analizador búsqueda de cualquier entrada en su propia. Es necesario especificar el tipo de patrón específico en su lugar (en su caso que es boost::spirit::ascii:space_type).

Por otra parte, a fin de que sus reglas para devolver el atributo analizado, es necesario especificar el tipo de atributo se esperaba, mientras que la definición de la regla. Eso te deja con:

qi::rule<string::iterator, std::string(), ascii:space_type> 
    stringrule = *(char_ - ',');
qi::rule<string::iterator, MyStruct(), ascii:space_type> 
    myrule = repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',');

que debe hacer exactamente lo que espera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top