简体   繁体   English

如何正确使用灵气属性?

[英]How to use spirit's qi attributes properly?

I want to parse something like "a=1;b=2;{c=3;d=4;}e=5;f=6;". 我想解析类似“ a = 1; b = 2; {c = 3; d = 4;} e = 5; f = 6;”的内容。 My problem is how to handle the block within the '{}' chars. 我的问题是如何处理'{}'字符内的块。 The values within the block shall be parsed (but not propagated to attribute of r1) if ignoreBlock is true. 如果ignoreBlock为true,则将解析该块内的值(但不传播到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);

This code causes some error like: 'static_cast': cannot convert from const std::vector<std::pair<std::string,int>,std::allocator<_Ty>>' to 'std::pair<std::string,int>' 此代码会导致一些错误,例如: 'static_cast': cannot convert from const std::vector<std::pair<std::string,int>,std::allocator<_Ty>>' to 'std::pair<std::string,int>'

How do I handle such conditional parts correctly? 如何正确处理这些有条件的零件?

Why do you bind ignoreBlock in the rules, when you don't have anything changing it during parsing? 当在解析过程中没有任何更改时,为什么要在规则中绑定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('}'));
}

This doesn't reject unbalanced parentheses, but can be adapted to. 这不会拒绝不平衡的括号,但是可以适应。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM