gpt4 book ai didi

c++ - 用 Spirit::Qi 解析语法失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:56 26 4
gpt4 key购买 nike

我是 Spirit::Qi 的新手,我正在尝试编写一个简单的 Wavefront Obj 解析器。我遵循了 Boost::Spirit 文档站点 ( link ) 中的教程,并且大部分内联规则都起作用了。我已经开始尝试使用语法,但我似乎无法让它们发挥作用。过了一会儿我确实让它编译了,但是解析失败了。我真的不知道我做错了什么。

为了简单起见,我创建了一个包含以下内容的简单文本文件:

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 仍然是空的......

有什么建议吗?

编辑:

添加空格跳过器后(这是正确的名称吗?),只有第一个“v”被添加到编码为 float (118.0f) 的 std::vector 中,但未添加实际数字。我的猜测是我的规则不正确。我只想添加数字并跳过 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 );
}

最佳答案

您的规则声明了错误的公开属性。改变它:

qi::rule<std::string::const_iterator, std::vector<float>(), iso8859::space_type> vertex;

但是,由于您没有将语法结构模板化为任何东西(例如迭代器/船长类型),因此拥有语法结构毫无意义。相反,让 phrase_parse 一次简单地推导迭代器、船长和规则类型并编写:

bool parseObj(std::string const& data, std::vector<float> &v )
{
return qi::phrase_parse(
data.cbegin(), data.cend(),
'v' >> qi::float_ >> qi::float_ >> qi::float_,
qi::space, v);
}

我想您会同意这更切中要害。作为奖励,由于自动属性传播规则的强大功能,它“正常工作”(TM)。

但是,看到你的语法,你肯定想看到这些:

关于c++ - 用 Spirit::Qi 解析语法失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17532235/

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