Разбор вложенных данных в boost-spirit - PullRequest
1 голос
/ 03 июня 2011

Мне нужно разобрать текстовое дерево:

std::string data = "<delimiter>field1a fieald1b fieald1c<delimiter1>subfield11<delimiter1>subfieald12<delimiter1>subfieald13 ... <delimiter>field2a fieald2b fieald2c<delimiter1>subfield21<delimiter1>subfieald22<delimiter1>subfieald23 ..."

где <delimiter>,<delimiter1> является частью std :: string, а не одним символом

Можно токенизировать эту строку с boost :: spirit?

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

Анализатор списка - ваш друг:

namespace qi = boost::spirit::qi;

// tokenize on '<delimiter1>' and return the vector
rule<std::string::iterator, qi::space_type, std::vector<std::string>()> fields =
    *(char_ - "<delimiter1>") % "<delimiter1>";

std::string data("<delimiter>field1a fieald1b ...");
std::vector<std::vector<std::string> > fields_data;

// tokenize of '<delimiter>' and return a vector of vectors
qi::phrase_parse(data.begin(), data.end(), 
    fields % "<delimiter>", qi::space, fields_data);

Для этого вам может потребоваться последняя версия Spirit (Boost V1.47 или SVN trunk).

2 голосов
/ 03 июня 2011

Да, вы можете использовать дух для создания этого формата, но мне кажется, что это намного больше, чем вам нужно.

Я бы просто сам кодировал токениз, используя строковые функции std. Поочередно повысить: регулярное выражение должно сделать это очень легко для вас.

...