Boost Spirit AST 递归依赖问题

问题描述 投票:0回答:1

**

很奇怪,编译的时候出现了如下错误。谁能告诉我为什么。

还有很多错误,不知道是不是这个错误引起的。由于递归很深,所以无法贴出全部代码

**

namespace  test {

struct last;
struct pre{
    std::vector<char> cs;
    double first;
    std::vector<x3::forward_ast<last>> second;
};
struct last : x3::variant<boost::recursive_wrapper<pre>,intmax_t>{
    using base_type::base_type;
    using base_type::operator=;
};

}

BOOST_FUSION_ADAPT_STRUCT(test::pre,cs,first,second);

测试代码:

 std::string input = R"(
    123,xxxxxx|456.00,45645,ffffffff|33.22
)";


std::vector<test::last> out;
bool r = x3::phrase_parse(input.begin(), input.end(),  ((*x3::char_ >> '|' >> x3::double_) | x3::int_) % ',', x3::ascii::space, out);
if(r && (g_iter == g_end)){
    std::cout << "parse success!" << std::endl;
}else{
    std::cerr << "parse fail!" << std::endl;
}

编译错误日志:

I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/support/ast/variant.hpp(184): error C2679: 二元“=”: 没有找到接受“_Ty”类型的右操作数的运算符(或没有可接受的转换)
        with
        [
            _Ty=boost::fusion::deque<std::basic_string<char,std::char_traits<char>,std::allocator<char>>,double>
        ]
I:\boost_1_83_0\build\debug\include\boost/variant/variant.hpp(2172): note: 可能是“boost::variant<boost::recursive_wrapper<test::pre>,intmax_t> &boost::variant<boost::recursive_wrapper<test::pre>,intmax_t>::operator =(boost::variant<boost::recursive_wrapper<test::pre>,intmax_t> &&) noexcept(false)”
I:\boost_1_83_0\build\debug\include\boost/variant/variant.hpp(2165): note: 或    “boost::variant<boost::recursive_wrapper<test::pre>,intmax_t> &boost::variant<boost::recursive_wrapper<test::pre>,intmax_t>::operator =(const boost::variant<boost::recursive_wrapper<test::pre>,intmax_t> &)”
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/support/ast/variant.hpp(183): note: 尝试匹配参数列表“(boost::variant<boost::recursive_wrapper<test::pre>,intmax_t>, _Ty)”时
        with
        [
            _Ty=boost::fusion::deque<std::basic_string<char,std::char_traits<char>,std::allocator<char>>,double>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/support/traits/move_to.hpp(115): note: 查看对正在编译的函数 模板 实例化“boost::spirit::x3::variant<boost::recursive_wrapper<test::pre>,intmax_t> &boost::spirit::x3::variant<boost::recursive_wrapper<test::pre>,intmax_t>::operator =<boost::fusion::deque<Attribute,double>,void>(T &&) noexcept(false)”的引用
        with
        [
            Attribute=std::basic_string<char,std::char_traits<char>,std::allocator<char>>,
            T=boost::fusion::deque<std::basic_string<char,std::char_traits<char>,std::allocator<char>>,double>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/support/traits/move_to.hpp(115): note: 查看对正在编译的函数 模板 实例化“boost::spirit::x3::variant<boost::recursive_wrapper<test::pre>,intmax_t> &boost::spirit::x3::variant<boost::recursive_wrapper<test::pre>,intmax_t>::operator =<boost::fusion::deque<Attribute,double>,void>(T &&) noexcept(false)”的引用
        with
        [
            Attribute=std::basic_string<char,std::char_traits<char>,std::allocator<char>>,
            T=boost::fusion::deque<std::basic_string<char,std::char_traits<char>,std::allocator<char>>,double>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/support/traits/move_to.hpp(152): note: 查看对正在编译的函数 模板 实例化“void boost::spirit::x3::traits::detail::move_to<Source,Dest>(Source &,Dest &,boost::spirit::x3::traits::variant_attribute,boost::mpl::false_)”的引用
        with
        [
            Source=boost::fusion::deque<std::basic_string<char,std::char_traits<char>,std::allocator<char>>,double>,
            Dest=value_type
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/support/traits/move_to.hpp(196): note: 查看对正在编译的函数 模板 实例化“void boost::spirit::x3::traits::detail::move_to<T1,Dest>(Source &,Dest &,boost::spirit::x3::traits::variant_attribute)”的引用
        with
        [
            T1=boost::fusion::deque<std::basic_string<char,std::char_traits<char>,std::allocator<char>>,double>,
            Dest=value_type,
            Source=boost::fusion::deque<std::basic_string<char,std::char_traits<char>,std::allocator<char>>,double>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/operator/detail/alternative.hpp(175): note: 查看对正在编译的函数 模板 实例化“void boost::spirit::x3::traits::move_to<T1&,T2>(Source,Dest &)”的引用     
        with
        [
            T1=boost::fusion::deque<std::basic_string<char,std::char_traits<char>,std::allocator<char>>,double>,
            T2=value_type,
            Source=boost::fusion::deque<std::basic_string<char,std::char_traits<char>,std::allocator<char>>,double> &,
            Dest=value_type
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/operator/detail/alternative.hpp(191): note: 查看对正在编译的函数 模板 实例化“void boost::spirit::x3::detail::move_if<true>::call<boost::fusion::deque<Attribute,double>,test::last>(T1 &,T2 &)”的引用
        with
        [
            Attribute=std::basic_string<char,std::char_traits<char>,std::allocator<char>>,
            T1=boost::fusion::deque<std::basic_string<char,std::char_traits<char>,std::allocator<char>>,double>,
            T2=value_type
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/operator/detail/alternative.hpp(209): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_alternative<Subject,Iterator,Context,RContext,Attribute>(const Parser &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &)”的引用
        with
        [
            Subject=boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=value_type,
            Parser=boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(97): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::alternative_helper<Left>::parse<Iterator,Context,RContext,value_type>(Iterator &,const Iterator &,const Context &,RContext &,Attribute &) const”的引用
        with
        [
            Left=boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=value_type
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(97): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::alternative_helper<Left>::parse<Iterator,Context,RContext,value_type>(Iterator &,const Iterator &,const Context &,RContext &,Attribute &) const”的引用
        with
        [
            Left=boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=value_type
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(129): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_base_impl<Parser>::call_synthesize_x<Iterator,Context,RContext,Attribute>(const Parser &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &,boost::mpl::false_)”的引用
        with
        [
            Parser=boost::spirit::x3::detail::alternative_helper<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=std::vector<test::last,std::allocator<test::last>>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(128): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_base_impl<Parser>::call_synthesize_x<Iterator,Context,RContext,Attribute>(const Parser &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &,boost::mpl::false_)”的引用
        with
        [
            Parser=boost::spirit::x3::detail::alternative_helper<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=std::vector<test::last,std::allocator<test::last>>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(183): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_base_impl<Parser>::call_synthesize<Iterator,Context,RContext,Attribute>(const Parser &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &)”的引用
        with
        [
            Parser=boost::spirit::x3::detail::alternative_helper<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=std::vector<test::last,std::allocator<test::last>>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(183): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_base_impl<Parser>::call_synthesize<Iterator,Context,RContext,Attribute>(const Parser &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &)”的引用
        with
        [
            Parser=boost::spirit::x3::detail::alternative_helper<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=std::vector<test::last,std::allocator<test::last>>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(193): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_base_impl<Parser>::call_synthesize_dispatch_by_seq<Iterator,Context,RContext,Attribute>(const Parser &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &,boost::mpl::false_)”的引用
        with
        [
            Parser=boost::spirit::x3::detail::alternative_helper<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=std::vector<test::last,std::allocator<test::last>>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(192): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_base_impl<Parser>::call_synthesize_dispatch_by_seq<Iterator,Context,RContext,Attribute>(const Parser &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &,boost::mpl::false_)”的引用
        with
        [
            Parser=boost::spirit::x3::detail::alternative_helper<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=std::vector<test::last,std::allocator<test::last>>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(215): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_base_impl<Parser>::call<Iterator,Context,RContext,Attribute>(const Parser &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &,boost::mpl::true_)”的引用
        with
        [
            Parser=boost::spirit::x3::detail::alternative_helper<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=std::vector<test::last,std::allocator<test::last>>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(214): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_base_impl<Parser>::call<Iterator,Context,RContext,Attribute>(const Parser &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &,boost::mpl::true_)”的引用
        with
        [
            Parser=boost::spirit::x3::detail::alternative_helper<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=std::vector<test::last,std::allocator<test::last>>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(304): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_base_impl<Parser>::call<Iterator,Context,RContext,Attribute>(const Parser &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &)”的引用
        with
        [
            Parser=boost::spirit::x3::detail::alternative_helper<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=std::vector<test::last,std::allocator<test::last>>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(303): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_base_impl<Parser>::call<Iterator,Context,RContext,Attribute>(const Parser &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &)”的引用
        with
        [
            Parser=boost::spirit::x3::detail::alternative_helper<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=std::vector<test::last,std::allocator<test::last>>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/operator/detail/alternative.hpp(234): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container<boost::spirit::x3::detail::alternative_helper<Left>,Iterator,Context,RContext,Attribute>(const Parser &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &)”的引用
        with
        [
            Left=boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=std::vector<test::last,std::allocator<test::last>>,
            Parser=boost::spirit::x3::detail::alternative_helper<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/operator/detail/alternative.hpp(245): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_impl<Parser,Context,RContext,void>::call<Iterator,Attribute>(const boost::spirit::x3::alternative<Derived,boost::spirit::x3::int_parser<int,10,1,-1>> &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &,boost::mpl::true_)”的引用
        with
        [
            Parser=boost::spirit::x3::alternative<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>,boost::spirit::x3::int_type>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Attribute=std::vector<test::last,std::allocator<test::last>>,
            Derived=boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/operator/detail/alternative.hpp(244): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_impl<Parser,Context,RContext,void>::call<Iterator,Attribute>(const boost::spirit::x3::alternative<Derived,boost::spirit::x3::int_parser<int,10,1,-1>> &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &,boost::mpl::true_)”的引用
        with
        [
            Parser=boost::spirit::x3::alternative<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>,boost::spirit::x3::int_type>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Attribute=std::vector<test::last,std::allocator<test::last>>,
            Derived=boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(304): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_impl<Parser,Context,RContext,void>::call<Iterator,Attribute>(const boost::spirit::x3::alternative<Derived,boost::spirit::x3::int_parser<int,10,1,-1>> &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &)”的引
用
        with
        [
            Parser=boost::spirit::x3::alternative<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>,boost::spirit::x3::int_type>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Attribute=std::vector<test::last,std::allocator<test::last>>,
            Derived=boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/detail/parse_into_container.hpp(303): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container_impl<Parser,Context,RContext,void>::call<Iterator,Attribute>(const boost::spirit::x3::alternative<Derived,boost::spirit::x3::int_parser<int,10,1,-1>> &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &)”的引
用
        with
        [
            Parser=boost::spirit::x3::alternative<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>,boost::spirit::x3::int_type>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Attribute=std::vector<test::last,std::allocator<test::last>>,
            Derived=boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/operator/list.hpp(34): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::detail::parse_into_container<Left,Iterator,Context,RContext,Attribute>(const Parser &,Iterator &,const Iterator &,const Context &,RContext &,Attribute &)”的引用
        with
        [
            Left=boost::spirit::x3::alternative<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>,boost::spirit::x3::int_type>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type,
            Attribute=std::vector<test::last,std::allocator<test::last>>,
            Parser=boost::spirit::x3::alternative<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>,boost::spirit::x3::int_type>
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/parse.hpp(119): note: 查看对正在编译的函数 模板 实例化“bool boost::spirit::x3::list<Derived,boost::spirit::x3::extension::as_parser<char,void>::type>::parse<Iterator,boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::char_class<boost::spirit::char_encoding::ascii,boost::spirit::x3::space_tag>,boost::spirit::x3::unused_type>,const boost::spirit::x3::unused_type,Attribute>(Iterator &,const Iterator &,const Context &,RContext &,Attribute &) const”的引用
        with
        [
            Derived=boost::spirit::x3::alternative<boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::kleene<boost::spirit::x3::standard::char_type>,boost::spirit::x3::extension::as_parser<char,void>::type>,boost::spirit::x3::double_type>,boost::spirit::x3::int_type>,
            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
            Attribute=std::vector<test::last,std::allocator<test::last>>,
            Context=boost::spirit::x3::context<boost::spirit::x3::skipper_tag,const boost::spirit::x3::ascii::space_type,boost::spirit::x3::unused_type>,
            RContext=const boost::spirit::x3::unused_type
        ]
I:\boost_1_83_0\build\debug\include\boost/spirit/home/x3/core/parse.hpp(119): note: 查看对正在编译的函数 模板 实例化“bool
            
 

**

谁能指出错误在哪里,或者告诉我详细原因。

我将不胜感激

**

c++ boost boost-spirit boost-spirit-x3
1个回答
0
投票

我不清楚你想解析什么。

  • int_
    也将匹配,例如“123ab|234.45”
  • *char_
    匹配一切。其中包括
    '|'
    ,因此
    pre
    永远不会匹配
  • 第三个成员(
    second
    )没有解析器表达式,因此无法匹配

我注释掉了

second
并修正了规则以避免上面列出的问题。一如既往,具体有帮助:

auto pre = x3::rule<struct pre, AST::pre>{"pre"} = //
    (*~x3::char_("|") >> '|' >> x3::double_);
auto last = x3::rule<struct last, AST::last>{"last"} = //
    !x3::int_ >> pre | x3::int_;

现在你可以用

来解析
bool r = phrase_parse(          //
    input.begin(), input.end(), //
    last % ',' >> x3::eoi,      //
    x3::space, out);

现场演示

住在Coliru

#define BOOST_SPIRIT_X3_DEBUG
#include <boost/fusion/adapted.hpp>
#include <boost/spirit/home/x3.hpp>
#include <boost/spirit/home/x3/support/ast/variant.hpp>
#include <iostream>

namespace x3  = boost::spirit::x3;
namespace AST {
    struct last;
    struct pre {
        std::vector<char>                  cs;
        double                             first;
        std::vector<x3::forward_ast<last>> second;
    };
    struct last : x3::variant<boost::recursive_wrapper<pre>, intmax_t> {
        using base_type::base_type;
        using base_type::operator=;
    };
} // namespace AST

BOOST_FUSION_ADAPT_STRUCT(AST::pre, cs, first/*, second*/)

int main() {
    for (std::string const input :
         {
             R"(123,xxxxxx|456.00,45645,ffffffff|33.22)",
         }) //
    {

        std::vector<AST::last> out;

        auto pre = x3::rule<struct pre, AST::pre>{"pre"} = //
            (*~x3::char_("|") >> '|' >> x3::double_);
        auto last = x3::rule<struct last, AST::last>{"last"} = //
            !x3::int_ >> pre | x3::int_;

        bool r = phrase_parse(          //
            input.begin(), input.end(), //
            last % ',' >> x3::eoi,      //
            x3::space, out);

        if (r) {
            std::cout << "parse success!" << std::endl;
        } else {
            std::cerr << "parse fail!" << std::endl;
        }
    }
}

打印

parse success!

带有调试输出:

<last>
  <try>123,xxxxxx|456.00,45</try>
  <success>,xxxxxx|456.00,45645</success>
  <attributes>123</attributes>
</last>
<last>
  <try>xxxxxx|456.00,45645,</try>
  <pre>
    <try>xxxxxx|456.00,45645,</try>
    <success>,45645,ffffffff|33.2</success>
    <attributes>[[x, x, x, x, x, x], 456]</attributes>
  </pre>
  <success>,45645,ffffffff|33.2</success>
  <attributes>[[x, x, x, x, x, x], 456]</attributes>
</last>
<last>
  <try>45645,ffffffff|33.22</try>
  <success>,ffffffff|33.22</success>
  <attributes>45645</attributes>
</last>
<last>
  <try>ffffffff|33.22</try>
  <pre>
    <try>ffffffff|33.22</try>
    <success></success>
    <attributes>[[f, f, f, f, f, f, f, f], 33.22]</attributes>
  </pre>
  <success></success>
  <attributes>[[f, f, f, f, f, f, f, f], 33.22]</attributes>
</last>
© www.soinside.com 2019 - 2024. All rights reserved.