Я использую Повышение. Дух, который был распределен с Повышением 1.42.0 с VS2005. Моя проблема похожа на это.
У меня есть эта строка, которая была delimted с запятыми. Первые 3 поля его являются строками, и отдых числа. как это.
String1,String2,String3,12.0,12.1,13.0,13.1,12.4
Мое правило похоже на это
qi::rule stringrule = *(char_ - ',')
qi::rule myrule= repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',') ;
Я пытаюсь хранить данные в структуре как это.
struct MyStruct
{
vector stringVector ;
vector doubleVector ;
} ;
MyStruct var ;
Я перенес его в BOOST_FUSION_ADAPT_STRUCTURE для использования его с духом.
BOOST_FUSION_ADAPT_STRUCT (MyStruct, (vector, stringVector) (vector, doubleVector))
Моя функция синтаксического анализа анализирует строку и возвращает true и после
qi::phrase_parse (iterBegin, iterEnd, myrule, boost::spirit::ascii::space, var) ;
Я ожидаю var.stringVector, и var.doubleVector правильно заполнены. но это не имеет место.
Что идет не так, как надо?
Пример кода расположен здесь
Заранее спасибо, Surya
qi :: skip_type
- это не то, что вы мог использовать шкипера. qi :: skip_type - это тип заполнителя qi :: skip
, который применим только для директивы skip []
(чтобы разрешить пропуск внутри лексемы []
или для изменения используемого шкипера) и который не является компонентом анализатора, который сам по себе соответствует какому-либо входу. Вместо этого вам нужно указать конкретный тип шкипера (в вашем случае это 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_ % ',');
, который должен делать именно то, что вы ожидаете.