Спілкування з духами
Nov. 12th, 2010 06:54 pmМо кому згодиться - парсер детальної статистики Stargazer на Boost.Spirit2:
#include <string>
#include <list>
#include <boost/cstdint.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/std_pair.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
namespace qi = boost::spirit::qi;
struct Stat {
std::string ip;
int dir;
uint64_t down;
uint64_t up;
double cash;
};
struct Interval {
std::string fromTime;
std::string toTime;
};
typedef std::list<Stat> Stats;
typedef std::pair<Interval, Stats> StatRec;
typedef std::list<StatRec> StatRecs;
BOOST_FUSION_ADAPT_STRUCT(
Stat,
(std::string, ip)
(int, dir)
(uint64_t, down)
(uint64_t, up)
(double, cash)
)
BOOST_FUSION_ADAPT_STRUCT(
Interval,
(std::string, fromTime)
(std::string, toTime)
)
template <typename Iterator>
struct StatGrammar
: qi::grammar<Iterator, StatRecs()>
{
StatGrammar()
: StatGrammar::base_type(query)
{
query = +chunk;
chunk = timeline >> statlines;
statlines = +statline;
timeline = qi::lit("->") >> space >> timevalue >> qi::lit(" - ") >> timevalue >> eol;
statline = space >> ip >> space >> qi::int_ >> space >> qi::int_ >> space >> qi::int_ >> space >> qi::double_ >> eol;
timevalue = +qi::digit >> qi::char_('.') >> +qi::digit >> qi::char_('.') >> +qi::digit;
ip = +qi::digit >> qi::char_('.') >> +qi::digit >> qi::char_('.') >> +qi::digit >> qi::char_('.') >> +qi::digit;
space = *qi::char_("\t ");
eol = qi::lit("\r\n") | '\r' | '\n';
}
qi::rule<Iterator, StatRecs()> query;
qi::rule<Iterator, StatRec()> chunk;
qi::rule<Iterator, Stats()> statlines;
qi::rule<Iterator, Interval()> timeline;
qi::rule<Iterator, Stat()> statline;
qi::rule<Iterator, std::string()> ip;
qi::rule<Iterator, std::string()> timevalue;
qi::rule<Iterator> space, eol;
};
|
| _Winnie C++ Colorizer |