Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > boost spirit сохранение в структуру


Автор: Maledictus 10.4.2011, 21:06
Необходимо сохранить распаршеную строку в структуру:
Код

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;


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

Автор: boostcoder 10.4.2011, 21:07
с компилябельным примером больше шансов найти помощь ;)

Автор: Maledictus 10.4.2011, 21:26
что бы на забивать тут все своим кодом - выложил его на пасту:

http://codepaste.net/cgvna7

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)