c++ - 如何正确使用精神的气属性?
问题描述
我想解析类似“a=1;b=2;{c=3;d=4;}e=5;f=6;”的东西。我的问题是如何处理“{}”字符中的块。如果 ignoreBlock 为真,则应解析块内的值(但不传播到 r1 的属性)。
using namespace boost::spirit;
using namespace std;
bool ignoreBlock = true;
qi::rule<std::string::iterator, vector<pair<string, int>>()> r1;
qi::rule<std::string::iterator, pair<string, int>()> r2;
qi::rule<std::string::iterator, vector<pair<string, int>>()> r3;
r1 = *(r2 | (qi::eps(phoenix::ref(ignoreBlock)==true) >> qi::omit[r3]) | r3);
r2 = qi::as<string>()[+qi::alnum] >> '=' >> qi::int_ >> ';';
r3 = '{' >> *r2 >> '}';
string s = { "a=1;b=2;{c=3;d=4;}e=5;f=6;"};
vector<pair<string, int>> v;
phrase_parse(s.begin(), s.end(), r1, boost::spirit::ascii::space, v);
此代码会导致一些错误,例如:
'static_cast': cannot convert from const std::vector<std::pair<std::string,int>,std::allocator<_Ty>>' to 'std::pair<std::string,int>'
如何正确处理此类条件部分?
解决方案
ignoreBlock
当您在解析过程中没有任何更改时,为什么要绑定规则?
qi::rule<std::string::iterator, vector<pair<string, int>>()> r1;
qi::rule<std::string::iterator, pair<string, int>()> r2;
r2 = qi::as<string>()[+qi::alnum] >> '=' >> qi::int_ >> ';';
if (ignoreBlock)
{
qi::rule<std::string::iterator, void()> r3;
r1 = *(r2 | r3);
r3 = '{' >> *r2 >> '}';
}
else
{
r1 = *(r2 | qi::lit('{') | qi::lit('}'));
}
这不会拒绝不平衡的括号,但可以适应。
推荐阅读
- r - dplyr 的 sample_frac 函数返回错误
- microsoft-graph-api - MS Graph API 团队:获取消息计数
- scip - SCIP:在特定节点以各种模式获取下限和上限
- swift - 如何在collectionview中查看pdf文件?
- python - Python selenium 一直等待整个页面加载,即使有显式等待
- c - 无法将结构指针传递给 C 中函数内的函数
- swift - 将承载令牌添加到 Swift 中的标头的问题(HTTP POST 调用)
- gatsby - Gatsby、RSS 提要和无头 CMS
- javascript - “下载”图像并添加到数组
- r - 从数据框中的列中采样唯一行而不进行替换