Analisando a string, com o Boost Spirit 2, para preencher dados na estrutura definida pelo usuário
-
20-09-2019 - |
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
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.