Я новичок в Spirit::Qi и пытаюсь написать простой парсер Wavefront Obj. Я следовал руководствам с сайта документации Boost::Spirit (ссылка), и у меня работает большинство встроенных правил. Я начал экспериментировать с грамматиками, но не могу заставить их работать. Через некоторое время я скомпилировал его, но синтаксический анализ не удался. Я действительно не знаю, что я делаю неправильно.
Для начала я создал простой текстовый файл, содержащий следующее:
v -1.5701 33.8087 0.3592
v -24.0119 0.0050 21.7439
v 20.8717 0.0050 21.7439
v 20.8717 0.0050 -21.0255
v -24.0119 0.0050 -21.0255
v -1.5701 0.0050 0.3592
Просто чтобы быть уверенным: чтение входного файла работает нормально.
Я написал небольшую функцию, которая должна анализировать входную строку, но по какой-то причине она не работает:
bool Model::parseObj( std::string &data, std::vector<float> &v )
{
struct objGram : qi::grammar<std::string::const_iterator, float()>
{
objGram() : objGram::base_type(vertex)
{
vertex = 'v' >> qi::float_
>> qi::float_
>> qi::float_;
}
qi::rule<std::string::const_iterator, float()> vertex;
};
objGram grammar;
return qi::phrase_parse( data.cbegin(), data.cend(),
grammar, iso8859::space, v );
}
qi::phrase_parse продолжает возвращать false, а std::vector v все еще пуст в конце...
Какие-либо предложения?
РЕДАКТИРОВАТЬ:
После добавления пробельных шкиперов (это правильное имя?) к std::vector добавляется только первый 'v', закодированный как число с плавающей запятой (118.0f), но фактические числа не добавляются. Я предполагаю, что мое правило неверно. Я хочу добавить только цифры и пропустить v.
Вот моя модифицированная функция:
bool Model::parseObj( std::string &data, std::vector<float> &v )
{
struct objGram : qi::grammar<std::string::const_iterator, float(), iso8859::space_type>
{
objGram() : objGram::base_type(vertex)
{
vertex = qi::char_('v') >> qi::float_
>> qi::float_
>> qi::float_;
}
qi::rule<std::string::const_iterator, float(), iso8859::space_type> vertex;
} objGrammar;
return qi::phrase_parse( data.cbegin(), data.cend(),
objGrammar, iso8859::space, v );
}