Как правильно использовать атрибуты ци духа? - PullRequest
0 голосов
/ 29 мая 2018

Я хочу разобрать что-то вроде "a = 1; b = 2; {c = 3; d = 4;} e = 5; f = 6;".Моя проблема в том, как обрабатывать блок в символах '{}'.Значения в блоке должны быть проанализированы (но не переданы в атрибут r1), если ignoreBlock имеет значение true.

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>'

Как мнеправильно обращаться с такими условными частями?

1 Ответ

0 голосов
/ 29 мая 2018

Почему вы связываете 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('}'));
}

Это не отвергает несбалансированные скобки, но может быть адаптировано к.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...