2

Я следующий код мне нужно разобрать строку и переместить его в структуры определяется следующим образом:синтаксического анализа строки в структуры с повышающего духом

#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.

Я попытался определить этот параметр для размер я хочу, прежде чем я включу файлы заголовка духа, но я все еще получаю ошибки компиляции.

Как решить эту проблему?

ответ

7

Если вы проверить, что компилятор жалуется, вы увидите что-то вроде этого:

.... 
/usr/include/boost/fusion/container/vector/convert.hpp:26:13: error: invalid use of incomplete type ‘struct boost::fusion::detail::as_vector<12>’ 
.... 
/usr/include/boost/fusion/container/vector/detail/as_vector.hpp:26:12: error: declaration of ‘struct boost::fusion::detail::as_vector<12>’ 

Я столкнулся с этой проблемой некоторое время назад, а также. Если ваша структура содержит более 10 полей , вам необходимо переопределить FUSION_MAX_VECTOR_SIZE, так как контейнер (ы) слияния объединяет согласованные атрибуты.

http://www.boost.org/doc/libs/1_52_0/libs/fusion/doc/html/fusion/container/vector.html http://www.boost.org/doc/libs/1_52_0/libs/spirit/doc/html/spirit/qi/quick_reference/compound_attribute_rules.html

Я хотел бы использовать эти два Определяет, прежде чем все остальные включаемые файлы, чтобы переопределить значения по умолчанию:

#define FUSION_MAX_VECTOR_SIZE  20 
#define SPIRIT_ARGUMENTS_LIMIT  20 
+0

Большое спасибо, это сработало :) – Shohreh

Смежные вопросы