Синтаксический анализ строки с помощью Boost Spirit 2 для заполнения данных в определяемой пользователем структуре.
-
20-09-2019 - |
Вопрос
Я использую Boost.Spirit, который распространялся вместе с Boost-1.42.0 с VS2005.Моя проблема такая.
У меня есть строка, разделенная запятыми.Первые 3 поля — это строки, а остальные — числа.так.
String1,String2,String3,12.0,12.1,13.0,13.1,12.4
Мое правило такое
qi::rule<string::iterator, qi::skip_type> stringrule = *(char_ - ',')
qi::rule<string::iterator, qi::skip_type> myrule= repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',') ;
Я пытаюсь сохранить данные в такой структуре.
struct MyStruct
{
vector<string> stringVector ;
vector<double> doubleVector ;
} ;
MyStruct var ;
Я обернул его в BOOST_FUSION_ADAPT_STRUCTURE, чтобы использовать его с духом.
BOOST_FUSION_ADAPT_STRUCT (MyStruct, (vector<string>, stringVector) (vector<double>, doubleVector))
Моя функция синтаксического анализа анализирует строку и возвращает true и после
qi::phrase_parse (iterBegin, iterEnd, myrule, boost::spirit::ascii::space, var) ;
Я ожидаю, что var.stringVector и var.doubleVector заполнены правильно.но это не так.
Что происходит не так?
Пример кода находится здесь
Заранее спасибо, Сурья
Решение
qi::skip_type
это не то, что вам могло бы пригодиться шкиперу.qi::skip_type — тип заполнителя qi::skip
, который применим для skip[]
только директива (чтобы разрешить пропуск внутри lexeme[]
или изменить используемый шкипер), и который не является компонентом синтаксического анализатора, соответствующим какому-либо входному сигналу сам по себе.Вместо этого вам необходимо указать конкретный тип шкипера (в вашем случае это boost::spirit::ascii:space_type
).
Более того, чтобы ваши правила возвращали проанализированный атрибут, вам необходимо указать тип ожидаемого атрибута при определении вашего правила.Это оставляет вам:
qi::rule<string::iterator, std::string(), ascii:space_type>
stringrule = *(char_ - ',');
qi::rule<string::iterator, MyStruct(), ascii:space_type>
myrule = repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',');
который должен делать именно то, что вы ожидаете.