Spirit has a built-in construct for lists:
~*char( ':' ) % ':'
If you use attribute parsing you can simply perform the following:
std::vector< std::string > list_of_strings;
parse( begin, end,
~*char( ':' ) % ':',
list_of_strings
);
Nice huh?
Nice, but IUUC, it won't take into account the type of the elements, right?
I tried to do the following (but it doesn't match the input string):
//
#include
#include
#include
#include
#include
#include
#include <string>
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
namespace details
{
struct sensor
{
int id;
std::string type;
int cam;
int group;
std::string name;
int state;
std::string regs;
};
}
BOOST_FUSION_ADAPT_STRUCT
(
details::sensor,
(int, id)
(std::string, type)
(int, cam)
(int, group)
(std::string, name)
(int, state)
(std::string, regs)
)
namespace details
{
template <typename Iterator>
struct sensor_parser : qi::grammar
{
sensor_parser() : sensor_parser::base_type(start)
{
using qi::int_;
using qi::lit;
using qi::double_;
using qi::lexeme;
using qi::eol;
using ascii::char_;
text %= lexeme[+(char_ - ':')];
start %=
int_ >> ':'
>> text >> ':'
>> int_ >> ':'
>> int_ >> ':'
>> text >>
-(':' >> int_) >>
-(':' >> text) >>
eol
;
}
qi::rule text;
qi::rule start;
};
}
int main()
{
using boost::spirit::ascii::space;
typedef std::string::const_iterator iterator_type;
typedef details::sensor_parser sensor_parser;
sensor_parser g;
std::string str = "3:abcd:3:3:My name:1:33333333333\r\n";
details::sensor emp;
std::string::const_iterator iter = str.begin();
std::string::const_iterator end = str.end();
bool r = phrase_parse(iter, end, g, space, emp);
if (r && iter == end)
return 1;
}