понедельник, 27 декабря 2010 г.

Boost spirit

Использование boost::spirit - Очень интересный способ парсинга строк. Приведу краткий пример:
#include <string>
#include <map>
#include <iostream>

#include <boost/spirit/core.hpp>
#include <boost/spirit/actor/assign_actor.hpp>
#include <boost/spirit/actor/insert_at_actor.hpp>
#include <algorithm>

using namespace boost::spirit;

bool parseConfig( const char * str, std::map<std::string,std::string> & mp ) {
    mp.clear();
    std::string key;

    return parse(str,
        ((lexeme_d[+alnum_p][assign_a(key)] >> '=' >> lexeme_d[+alnum_p][insert_at_a(mp,key)]) % ','),
        space_p
    ).full;
}

void show_elem(const std::pair<std::string,std::string> & pair) {
    std::cout << pair.first << " = " << pair.second << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::map<std::string,std::string> map;

    std::cout << parseConfig(" key1=val1, key2=val2, param=param_val ", map) << std::endl;
    std::for_each(map.begin(), map.end(), show_elem);

    return 0;
}
Colored with dumpz.org

Пример будет дополняться объяснениями.

Очень хорошо объяснено тут:
http://blog.alno.name/ru/2008/09/parsers-in-cpp-with-boost-spirit