Необходимо сохранить распаршеную строку в структуру:
| Код | 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;
|
Не могу понять как для этого надо переделать грамматику. Заранее благодарю |