Analisando a string, com o Boost Spirit 2, para preencher dados na estrutura definida pelo usuário

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

Pergunta

Estou usando o boost.spirit que foi distribuído com o Boost-1.42.0 com o VS2005. Meu problema é assim.

Eu tenho essa string que foi delimitada com vírgulas. Os três primeiros campos são strings e descanso são números. assim.

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

Minha regra é assim

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

Estou tentando armazenar os dados em uma estrutura como essa.

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

MyStruct var ;

Eu o envolvi em boost_fusion_adapt_structure para usá -lo com espírito.

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

Minha função parse analisa a linha e retorna verdadeira e depois

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

Estou esperando Var.StringVector e Var.DoubleVector estão preenchidos adequadamente. Mas não é o caso.

O que está dando errado?

A amostra de código está localizada aqui

Obrigado antecipadamente, Surya

Foi útil?

Solução

qi::skip_type não é algo que você possa usar um capitão. qi :: skip_type é o tipo de espaço reservado qi::skip, que é aplicável ao skip[] apenas diretiva (para permitir pular dentro de um lexeme[] ou para alterar o capitão em uso) e que não é um componente de analisador que corresponda a qualquer entrada por conta própria. Você precisa especificar seu tipo de capitão específico (no seu caso, esse é boost::spirit::ascii:space_type).

Além disso, para que suas regras retornem o atributo analisado, você precisa especificar o tipo de atributo esperado ao definir sua regra. Isso deixa você com:

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

o que deve fazer exatamente o que você espera.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top