我有以下代码,我需要解析一个字符串并将其移至定义如下的结构:
#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_("a-zA-Z0-9@$")));
}
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);
好的,问题是当我的结构体具有10个或更少的字段时,我的代码可以很好地编译,但是当我的结构体中具有更多的字段时,它给出错误
,所以我猜想这是因为有参数
SPIRIT_ARGUMENTS_LIMIT
的缘故,因为它的默认值为10。在包含Spirit头文件之前,我尝试将此参数定义为所需的大小,但仍然出现编译错误
我应该如何解决这个问题?
最佳答案
如果检查编译器抱怨什么,您将看到类似以下内容:
....
/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
关于boost - 用boost spirit 将字符串解析为struct,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16631529/