我是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);
}
齐:: phrase_parse保持返回false和性病::向量v仍然是空的结束...
有什么建议吗?
编辑:
加入添加空间船长(?是,正确的名称),仅第一“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);
}
1)如果提供完整的代码,你有更多的关注 2)让看一眼的机会...... 118是ASCII码为你的“V”所以它传播到错误输出。如果你想避免它,你有两种选择(可能更多): a)qi :: lit('v')>> qi :: float_ >> qi :: float_ >> qi :: float_ b)qi: :省略[qi :: char _('v')] >> qi :: float_ >> qi :: float_ >> qi :: float_ –
@ G.Civardi Ah。你在同一时间发现了这个问题。你错过了罪魁祸首,但我链接到你的答案浮法精度问题:)干杯 – sehe
@sehe没有问题,非常感谢:-)干杯 –