【发布时间】:2015-09-16 14:37:19
【问题描述】:
解析器
namespace qi = boost::spirit::qi;
template<typename T>
class action
{
public:
action(std::vector<std::shared_ptr<part>>& parts) : m_parts{ parts } {}
void operator()(const std::vector<char>& cc, qi::unused_type, qi::unused_type) const
{
std::string s(cc.begin(), cc.end());
if (s.length() > 0) {
auto p = new T(s);
m_parts.push_back(std::shared_ptr<part>(p));
}
}
private:
std::vector<std::shared_ptr<part>>& m_parts;
};
std::vector<std::shared_ptr<part>> parse(const std::string& source) {
namespace ascii = boost::spirit::ascii;
using ascii::char_;
using qi::lit;
std::vector<std::shared_ptr<part>> parts;
auto prop_g = lit("{{=")
>> *char_(' ')
>> (*(char_ - char_("} ")))[action<property_part>(parts)]
>> *char_(' ')
>> "}}"
;
auto text_g = (+(char_ - '{'))[action<text_part>(parts)];
auto g = -text_g >> +(prop_g >> text_g);
qi::parse(source.begin(), source.end(), g);
return parts;
}
在 Kitkat 设备上测试时导致 qi::parse 调用出错。错误发生在调用任何语义操作之前。相同的代码适用于 Xcode 6/iOS 8.4 和 VS 2015。我们使用的是 Boost 1.59。
我们可以将 Spirit 替换为 Bison,暗示一个额外的构建步骤,或者将 Clang 与 Android NDK 一起使用,让我们摆脱常规。
能否通过构建配置修复此错误,或者我们可以探索其他选项吗?
【问题讨论】:
标签: c++ gcc boost android-ndk boost-spirit-qi