Я пытаюсь написать простой загрузчик файлов OBJ, используя библиотеку Boost Spirit. Несмотря на то, что я работал с использованием стандартного std :: ifstreams, мне интересно, можно ли выполнить фразу_parse для всего файла, используя файл с отображением в памяти, так как он, кажется, обеспечивает лучшую производительность в том виде, в котором он был опубликован Вот.
У меня есть следующий код, который, кажется, работает хорошо, но он ломается, когда в файле есть комментарий. Итак, мой вопрос: как вы игнорируете комментарий, начинающийся с ‘#’ в файле OBJ, используя Spririt?
struct vertex {
double x, y, z;
};
BOOST_FUSION_ADAPT_STRUCT(
vertex,
(double, x)
(double, y)
(double, z)
)
std::vector<vertex> b_vertices
boost::iostreams::mapped_file mmap(
path,
boost::iostreams::mapped_file::readonly);
const char* f = mmap.const_data();
const char* l = f + mmap.size();using namespace boost::spirit::qi;
bool ok = phrase_parse(f,l,(("v" >> double_ >> double_ >> double_) |
("vn" >> double_ >> double_>> double_)) % eol ,
blank, b_vertices);
Приведенный выше код хорошо работает, когда нет комментариев или каких-либо других данных, кроме вершин / нормалей. Но когда есть другой тип данных, синтаксический анализатор дает сбой (как и должно быть), и мне интересно, есть ли способ заставить его работать, не возвращаясь к разбору каждой строки, поскольку это медленнее (почти в 2,5 раза в моих тестах) , Спасибо!
Самый простой способ, который приходит на ум — это просто пропустить комментарии:
bool ok = qi::phrase_parse(
f,l,
(
("v" >> qi::double_ >> qi::double_ >> qi::double_) |
("vn" >> qi::double_ >> qi::double_ >> qi::double_)
)
% qi::eol,
('#' >> *(qi::char_ - qi::eol) >> qi::eol | qi::blank), b_vertices);
Обратите внимание, что это также «распознает» комментарии, если #
появляется где-то внутри строки. Это, вероятно, просто отлично (так как это может привести к неудачному синтаксическому анализу, если только это не комментарий, завершающий строку ввода).
Видеть это Жить на Колиру
В качестве альтернативы, используйте магию феникса для обработки «строк комментариев» так же, как вы обрабатываете строки «vn» или «v».
Я понимаю, что мой комментарий / пост не имеет прямого отношения к коду, но я за то, чтобы не изобретать колесо, если это возможно, и я хотел бы знать об этой библиотеке. Я работал с рукописным загрузчиком OBJ / Wavefront, но в своем исследовании я нашел эту библиотеку Tiny Obj Loader. Эта библиотека написана на C ++ без каких-либо зависимостей, кроме C ++ STL. Он достаточно хорошо справляется с крайними случаями для спецификации Wavefront и очень быстр. Пользователь должен преобразовать объекты Tiny OBJ в их код. TinyObjLoader был принят на многих проектах. Я прошу прощения за то, что не ответил прямо на вопрос, и я хочу получить знания об этой замечательной библиотеке.