gpt4 book ai didi

c++ - 带有 Boost Spirit 的 OBJ 解析器 - 忽略评论

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:20 25 4
gpt4 key购买 nike

我正在尝试使用 Boost Spirit 库编写一个基本的 OBJ 文件加载器。虽然我使用标准 std::ifstreams 让它工作,但我想知道是否可以使用内存映射文件对整个文件执行 phrase_parse,因为它似乎提供了发布的最佳性能 here .

我有以下代码,它似乎运行良好,但当文件中有注释时它会中断。所以,我的问题是如何使用 Spririt 忽略 OBJ 文件中以“#”开头的注释?

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);

请注意,如果 # 出现在行内某处,这也会“识别”注释。这可能很好(因为它会使解析失败,除非它是尾随在其他有效输入行上的注释)。

查看 Live on Coliru

或者,使用一些凤凰魔法来处理“注释行”,就像处理“vn”或“v”行一样。

关于c++ - 带有 Boost Spirit 的 OBJ 解析器 - 忽略评论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20842508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com