![](/img/trans.png)
[英]How can I use polymorphic attributes with boost::spirit::qi parsers?
[英]How to use spirit's qi attributes properly?
我想解析類似“ a = 1; b = 2; {c = 3; d = 4;} e = 5; f = 6;”的內容。 我的問題是如何處理'{}'字符內的塊。 如果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);
此代碼會導致一些錯誤,例如: '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('}'));
}
這不會拒絕不平衡的括號,但是可以適應。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.