Я хотел бы использовать boost::spirit
для анализа структуры из std::string
.В моем примере строка выглядит как то, что будет прочитано из файла
Знаете ли вы, почему она вообще не анализируется?Я скопировал классический employee
пример, но строка не проанализирована.
AFG
std::string temp_1 =
"MyStruct { \n"
" a ""A"", \n"
" b ""B"", \n"
" c ""C"", \n"
" d ""D"" \n"
" } \n"
;
namespace client{
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
struct MyStruct{
std::string a;
std::string b;
std::string c;
std::string d;
};
};
BOOST_FUSION_ADAPT_STRUCT(
client::MyStruct,
(std::string, a)
(std::string, b)
(std::string, c)
(std::string, d)
)
namespace client
{
template <typename Iterator>
struct MyStruct_parser : qi::grammar<Iterator, MyStruct(), ascii::space_type>
{
MyStruct_parser() : MyStruct_parser::base_type(start)
{
using qi::lexeme;
using ascii::char_;
using qi::lit;
quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
start %=
lit("MyStruct")
>> '{'
>> "a" >> quoted_string >> ','
>> "b" >> quoted_string >> ','
>> "c" >> quoted_string >> ','
>> "d" >> quoted_string
>> '}'
;
}
qi::rule<Iterator, std::string(), ascii::space_type> quoted_string;
qi::rule<Iterator, MyStruct(), ascii::space_type> start;
};
}
int main( int argc, char** argv ){
using boost::spirit::ascii::space;
typedef std::string::const_iterator iterator_type;
typedef client::MyStruct_parser<iterator_type> MyStruct_parser;
std::stringstream inp(temp_1);
std::string line;
while( std::getline( line, inp ) ){
std::string::const_iterator a = line.begin();
std::string::const_iterator b = line.end();
MyStruct_parser g; // Our grammar
client::MyStruct obj;
bool r = phrase_parse( a, b, g, space, obj);
if( r ){
std::cout << "parsed" << std::endl;
}else{
std::cout << "not parsed" << std::endl;
}
}
return 1;
}