Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> boost spirit сохранение в структуру 
:(
    Опции темы
Maledictus
Дата 10.4.2011, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 7.9.2008
Где: Республика Белару сь, Борисов

Репутация: нет
Всего: 1



Необходимо сохранить распаршеную строку в структуру:
Код

struct IrcMessageStruct
{
    std::string Nickname_;
    std::string Command_;
        std::string Parameters_;
    std::string Message_;
};


Написал такую грамматику:
Код


BOOST_FUSION_ADAPT_STRUCT
(
    IrcMessageStruct,
    (std::string, Nickname_)
    (std::string, Command_)
    (std::string, Parameters_)
    (std::string, Message_)
)

template <typename Iterator>
struct Grammar : qi::grammar<Iterator, IrcMessageStruct ()>
{
    Grammar ()
    : Grammar::base_type (start)
    {
        Msg_ =  -qi::ascii::char_ (':') >> *qi::char_;

        Nospcrlfcl_ = (qi::ascii::char_ - '\0' - '\r' - '\n' - ' ' - ':');

        FirstParameters_ = qi::raw [Nospcrlfcl_
                >> *(qi::ascii::char_ (':') | Nospcrlfcl_)];

        Params_ = qi::raw [*(FirstParameters_ >> -qi::ascii::space)];

        Command_ = +qi::ascii::alpha |
                (qi::repeat (3) [qi::ascii::digit]);

        AsciiRange_ = qi::ascii::char_ (char (0x01), char (0x7F));

        Host_ = +(qi::ascii::char_ - qi::ascii::space);

        User_ = +(AsciiRange_ - '\r' - '\n' - ' ' - '@' - '\0');

        Special_ = qi::ascii::char_ ("[]\\`_^{|}");

        ShortName_ = *(qi::ascii::alnum | Special_)
                >> *(qi::ascii::alnum | Special_ | qi::ascii::char_ ('-'));

        HostName_ = qi::raw [ShortName_ % '.'];

        Nick_ = HostName_
                >> -(-(qi::ascii::char_ ('!')
                >> User_)
                >> qi::ascii::char_ ('@') >> Host_);

        MainRule_ = -qi::omit [':']
                >> -Nick_
                >> -qi::omit [qi::ascii::space]
                >> Command_
                >> -qi::omit [qi::ascii::space]
                >> -Params_
                >> -Msg_;

            start = MainRule_;
        }

        qi::rule<Iterator, IrcMessageStruct ()> start;
        qi::rule<Iterator, IrcMessageStruct ()> MainRule_;
        qi::rule<Iterator, std::string ()> Command_;
        qi::rule<Iterator, std::string ()> Params_;
        qi::rule<Iterator, std::string ()> Msg_;
        qi::rule<Iterator, std::string ()> FirstParameters_;
        qi::rule<Iterator, std::string ()> Nospcrlfcl_;
        qi::rule<Iterator, std::string ()> Nick_;
        qi::rule<Iterator, std::string ()> Host_;
        qi::rule<Iterator, std::string ()> User_;
        qi::rule<Iterator, std::string ()> HostName_;
        qi::rule<Iterator, std::string ()> ShortName_;
        qi::rule<Iterator> Special_;
        qi::rule<Iterator> AsciiRange_;
    };


входящее сообщение имеет следуюший вид:
:barjavel.freenode.net 005 leechcraft26 FNC TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR: EXTBAN=$,arx WHOX CLIENTVER=3.0 :are supported by this server"


Соответственно в структуе в итоге: 
Код

Nickname_ = barjavel.freenode.net;
Сommand_ = 005;
Message_ = are supported by this server;
Parameters  = leechcraft26 FNC TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR: EXTBAN=$,arx WHOX CLIENTVER=3.0


Необходимо заменить std::string Parameters_ на std::list<std::string> Parameters_ и в итоговой структуре получить

Код

Nickname_ = barjavel.freenode.net;
Сommand_ = 005;
Message_ = are supported by this server;
Parameters [0] = leechcraft26;
Parameters [1] = FNC;
Parameters [2] = TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR:;
Parameters [3] = EXTBAN=$,arx;
Parameters [4] = WHOX;
Parameters [5] = CLIENTVER=3.0;


Не могу понять как для этого надо переделать грамматику. Заранее благодарю

Это сообщение отредактировал(а) Maledictus - 10.4.2011, 21:07
PM MAIL ICQ Jabber   Вверх
boostcoder
Дата 10.4.2011, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



с компилябельным примером больше шансов найти помощь ;)
PM WWW   Вверх
Maledictus
Дата 10.4.2011, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 7.9.2008
Где: Республика Белару сь, Борисов

Репутация: нет
Всего: 1



что бы на забивать тут все своим кодом - выложил его на пасту:

boost::spirit
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0792 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.