Я следующий код мне нужно разобрать строку и переместить его в структуры определяется следующим образом:синтаксического анализа строки в структуры с повышающего духом
#include "boost\spirit\include\classic.hpp"
#include "boost\spirit\include\qi.hpp"
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/filesystem.hpp>
#include <boost/format.hpp>
#include <regex>
#include <string>
#include <boost\chrono.hpp>
#include <ctype.h>
#include <iostream>
struct my_struct
{
std::string s1;
std::string s2;
std::string s3;
std::string s4;
std::string s5;
std::string s6;
std::string s7;
std::string s8;
std::string s9;
std::string s10;
std::string s11;
};
BOOST_FUSION_ADAPT_STRUCT(
my_struct,
(std::string, s1)
(std::string, s2)
(std::string, s3)
(std::string, s4)
(std::string, s5)
(std::string, s6)
(std::string, s7)
(std::string, s8)
(std::string, s9)
(std::string, s10)
(std::string, s11)
)
моя грамматика это:
template <typename Iterator>
struct my_struct_parser : qi::grammar<Iterator, my_struct(), ascii::space_type>
{
my_struct_parser() : my_struct_parser::base_type(start)
{
using ascii::char_;
using qi::digit;
using qi::alpha;
start %=
qi::alpha>>"-"
>>qi::repeat(9)[digit]>>"-"
>>+(digit)>>"-"
>>+(digit)>>"-"
>>+(digit)>>"-"
>>qi::repeat(5)[digit]>>"-"
>>+char_("a-zA-Z")>>"-"
>>qi::repeat(2)[digit]>>"-"
>>+(digit)>>"-"
>>+(digit)>>"-"
>>+(qi::alpha)
>>-('-'>>+(char_("[email protected]$")));
}
qi::rule<Iterator, my_struct(), ascii::space_type> start;
};
, а затем я анализирую свои строки, используя следующие строки кода:
my_struct & emp;//this is passed as an argument to a function
typedef my_struct_parser<iterator_type> my_struct_parser_type;
my_struct_parser_type parser;
std::string::const_iterator iter = filename.begin();
std::string::const_iterator end = filename.end();
bool r =
boost::spirit::qi::phrase_parse(iter, end,parser,boost::spirit::ascii::space ,emp);
Итак, проблема заключается в мой код компилируется штраф WHe n моя структура имеет 10 полей или меньше, но она дает ошибки, когда у меня больше полей в структуре , поэтому я догадался, что это было из-за параметра SPIRIT_ARGUMENTS_LIMIT
, потому что его значение по умолчанию равно 10.
Я попытался определить этот параметр для размер я хочу, прежде чем я включу файлы заголовка духа, но я все еще получаю ошибки компиляции.
Как решить эту проблему?
Большое спасибо, это сработало :) – Shohreh