Spirit 无法将属性分配给单元素结构(或融合序列)
我的目标是让我的 qi::grammar 返回一个属性。不过,我在使用 spirit::lexer
执行此操作时遇到了很大的困难。
我希望使用下面给定的语法,如果我用 spirit::qi::parse(begin, end, Grammar, output); 调用它,
struct ident output< /code> 将包含已解析词素的内容。
错误似乎主要从这一行流出: start %= lexer.identifier;
System Notes
- Boost 1.47.0
- Mac OS X 10.7.2
- clang++ 或 g++ (下面显示的错误来自 clang++)
编译命令
g++ -g -c -O0 -Wall -DBOOST_SPIRIT_DEBUG -DBOOST_SPIRIT_LEXERTL_DEBUG -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SPIRIT_ACTIONS_ALLOW_ATTR_COMPAT reduced.cpp
源代码
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/spirit/home/lex.hpp>
#include <boost/spirit/home/lex/lexer/lexertl/lexer.hpp>
#include <boost/spirit/home/qi.hpp>
namespace spirit = boost::spirit;
struct ident {
std::string value;
};
BOOST_FUSION_ADAPT_STRUCT(ident,
(std::string, value)
)
struct my_lexer : spirit::lex::lexer< spirit::lex::lexertl::actor_lexer<> > {
spirit::lex::token_def<std::string> identifier;
};
struct my_grammar : spirit::qi::grammar<my_lexer::iterator_type, ident()> {
my_grammar(const my_lexer & lexer) : my_grammar::base_type(start) {
start %= lexer.identifier;
}
spirit::qi::rule<my_lexer::iterator_type, ident()> start;
};
2 报告错误
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:38:24: error: no matching constructor for initialization of 'ident'
attr = Attribute(first, last);
^ ~~~~~~~~~~~
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:94:13: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_iterators<ident, char const *,
void>::call' requested here
call(first, last, attr);
^
In file included from ../reduced-example/reduced.cpp:4:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/lexer.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/token.hpp:530:13: note: in instantiation of function template specialization 'boost::spirit::traits::assign_to<char const *, ident>'
requested here
spirit::traits::assign_to(t.value().begin(), t.value().end(), attr);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:330:59: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_value<ident,
boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, void>::call' requested here
assign_to_attribute_from_value<Attribute, T>::call(val, attr);
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:353:9: note: in instantiation of function template specialization
'boost::spirit::traits::detail::assign_to<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, ident>' requested here
detail::assign_to(val, attr, is_not_wrapped_container());
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:106:21: note: in instantiation of function template specialization
'boost::spirit::traits::assign_to<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, ident>' requested here
spirit::traits::assign_to(t, attr);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:21:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/reference.hpp:16:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/reference.hpp:43:20: note: (skipping 5 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
return ref.get().parse(first, last, context, skipper, attr);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:16:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function.hpp:64:
In file included from /home/wlynch/Boost/1.47.0/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:67:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/function_iterate.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/maybe_include.hpp:33:
/home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1042:5: note: in instantiation of function template specialization 'boost::function4<bool,
boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&>::function4<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
base_type(f)
^
/home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1083:5: note: in instantiation of function template specialization 'boost::function<bool
(boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&)>::function<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
self_type(f).swap(*this);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:182:19: note: in instantiation of function template specialization 'boost::function<bool
(boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&)>::operator=<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
lhs.f = detail::bind_parser<Auto>(
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:230:13: note: in instantiation of function template specialization
'boost::spirit::qi::rule<boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned
long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > >, ident (), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>::define<mpl_::bool_<1>,
boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >' requested here
define<mpl::true_>(r, expr, traits::matches<qi::domain, Expr>());
^
../reduced-example/reduced.cpp:23:9: note: in instantiation of function template specialization 'boost::spirit::qi::operator%=<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >'
requested here
start %= lexer.identifier;
^
../reduced-example/reduced.cpp:9:8: note: candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 2 were provided
struct ident {
^
../reduced-example/reduced.cpp:9:8: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:17:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/parser.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/domain.hpp:18:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/context.hpp:18:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/nonterminal/expand_arg.hpp:20:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/string_traits.hpp:16:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/container.hpp:368:22: error: no member named 'empty' in 'ident'
return c.empty();
~ ^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/container.hpp:375:47: note: in instantiation of member function 'boost::spirit::traits::is_empty_container<ident, void>::call' requested here
return is_empty_container<Container>::call(c);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:37:17: note: in instantiation of function template specialization 'boost::spirit::traits::is_empty<ident>' requested here
if (traits::is_empty(attr))
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:94:13: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_iterators<ident, char const *,
void>::call' requested here
call(first, last, attr);
^
In file included from ../reduced-example/reduced.cpp:4:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/lexer.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/token.hpp:530:13: note: in instantiation of function template specialization 'boost::spirit::traits::assign_to<char const *, ident>'
requested here
spirit::traits::assign_to(t.value().begin(), t.value().end(), attr);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:330:59: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_value<ident,
boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, void>::call' requested here
assign_to_attribute_from_value<Attribute, T>::call(val, attr);
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:353:9: note: (skipping 7 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
detail::assign_to(val, attr, is_not_wrapped_container());
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:16:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function.hpp:64:
In file included from /home/wlynch/Boost/1.47.0/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:67:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/function_iterate.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/maybe_include.hpp:33:
/home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1042:5: note: in instantiation of function template specialization 'boost::function4<bool,
boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&>::function4<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
base_type(f)
^
/home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1083:5: note: in instantiation of function template specialization 'boost::function<bool
(boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&)>::function<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
self_type(f).swap(*this);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:182:19: note: in instantiation of function template specialization 'boost::function<bool
(boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&)>::operator=<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
lhs.f = detail::bind_parser<Auto>(
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:230:13: note: in instantiation of function template specialization
'boost::spirit::qi::rule<boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned
long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > >, ident (), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>::define<mpl_::bool_<1>,
boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >' requested here
define<mpl::true_>(r, expr, traits::matches<qi::domain, Expr>());
^
../reduced-example/reduced.cpp:23:9: note: in instantiation of function template specialization 'boost::spirit::qi::operator%=<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >'
requested here
start %= lexer.identifier;
^
My goal is to have my qi::grammar
return an attribute. I'm having significant difficulty doing this with a spirit::lexer
though.
I'd expect that with the given grammar below, if I called it with spirit::qi::parse(begin, end, grammar, output);
, that the struct ident output
would have the contents of the parsed lexeme.
The error seems to mostly flow out of this line: start %= lexer.identifier;
System Notes
- Boost 1.47.0
- Mac OS X 10.7.2
- clang++ or g++ (errors shown below are from clang++)
Compile Command
g++ -g -c -O0 -Wall -DBOOST_SPIRIT_DEBUG -DBOOST_SPIRIT_LEXERTL_DEBUG -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SPIRIT_ACTIONS_ALLOW_ATTR_COMPAT reduced.cpp
Source Code
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/spirit/home/lex.hpp>
#include <boost/spirit/home/lex/lexer/lexertl/lexer.hpp>
#include <boost/spirit/home/qi.hpp>
namespace spirit = boost::spirit;
struct ident {
std::string value;
};
BOOST_FUSION_ADAPT_STRUCT(ident,
(std::string, value)
)
struct my_lexer : spirit::lex::lexer< spirit::lex::lexertl::actor_lexer<> > {
spirit::lex::token_def<std::string> identifier;
};
struct my_grammar : spirit::qi::grammar<my_lexer::iterator_type, ident()> {
my_grammar(const my_lexer & lexer) : my_grammar::base_type(start) {
start %= lexer.identifier;
}
spirit::qi::rule<my_lexer::iterator_type, ident()> start;
};
2 Errors Reported
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:38:24: error: no matching constructor for initialization of 'ident'
attr = Attribute(first, last);
^ ~~~~~~~~~~~
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:94:13: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_iterators<ident, char const *,
void>::call' requested here
call(first, last, attr);
^
In file included from ../reduced-example/reduced.cpp:4:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/lexer.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/token.hpp:530:13: note: in instantiation of function template specialization 'boost::spirit::traits::assign_to<char const *, ident>'
requested here
spirit::traits::assign_to(t.value().begin(), t.value().end(), attr);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:330:59: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_value<ident,
boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, void>::call' requested here
assign_to_attribute_from_value<Attribute, T>::call(val, attr);
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:353:9: note: in instantiation of function template specialization
'boost::spirit::traits::detail::assign_to<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, ident>' requested here
detail::assign_to(val, attr, is_not_wrapped_container());
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:106:21: note: in instantiation of function template specialization
'boost::spirit::traits::assign_to<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, ident>' requested here
spirit::traits::assign_to(t, attr);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:21:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/reference.hpp:16:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/reference.hpp:43:20: note: (skipping 5 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
return ref.get().parse(first, last, context, skipper, attr);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:16:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function.hpp:64:
In file included from /home/wlynch/Boost/1.47.0/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:67:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/function_iterate.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/maybe_include.hpp:33:
/home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1042:5: note: in instantiation of function template specialization 'boost::function4<bool,
boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&>::function4<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
base_type(f)
^
/home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1083:5: note: in instantiation of function template specialization 'boost::function<bool
(boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&)>::function<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
self_type(f).swap(*this);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:182:19: note: in instantiation of function template specialization 'boost::function<bool
(boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&)>::operator=<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
lhs.f = detail::bind_parser<Auto>(
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:230:13: note: in instantiation of function template specialization
'boost::spirit::qi::rule<boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned
long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > >, ident (), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>::define<mpl_::bool_<1>,
boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >' requested here
define<mpl::true_>(r, expr, traits::matches<qi::domain, Expr>());
^
../reduced-example/reduced.cpp:23:9: note: in instantiation of function template specialization 'boost::spirit::qi::operator%=<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >'
requested here
start %= lexer.identifier;
^
../reduced-example/reduced.cpp:9:8: note: candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 2 were provided
struct ident {
^
../reduced-example/reduced.cpp:9:8: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:17:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/parser.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/domain.hpp:18:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/context.hpp:18:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/nonterminal/expand_arg.hpp:20:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/string_traits.hpp:16:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/container.hpp:368:22: error: no member named 'empty' in 'ident'
return c.empty();
~ ^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/container.hpp:375:47: note: in instantiation of member function 'boost::spirit::traits::is_empty_container<ident, void>::call' requested here
return is_empty_container<Container>::call(c);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:37:17: note: in instantiation of function template specialization 'boost::spirit::traits::is_empty<ident>' requested here
if (traits::is_empty(attr))
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:94:13: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_iterators<ident, char const *,
void>::call' requested here
call(first, last, attr);
^
In file included from ../reduced-example/reduced.cpp:4:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/lexer.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/token.hpp:530:13: note: in instantiation of function template specialization 'boost::spirit::traits::assign_to<char const *, ident>'
requested here
spirit::traits::assign_to(t.value().begin(), t.value().end(), attr);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:330:59: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_value<ident,
boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, void>::call' requested here
assign_to_attribute_from_value<Attribute, T>::call(val, attr);
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:353:9: note: (skipping 7 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
detail::assign_to(val, attr, is_not_wrapped_container());
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:16:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function.hpp:64:
In file included from /home/wlynch/Boost/1.47.0/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:67:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/function_iterate.hpp:14:
In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/maybe_include.hpp:33:
/home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1042:5: note: in instantiation of function template specialization 'boost::function4<bool,
boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&>::function4<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
base_type(f)
^
/home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1083:5: note: in instantiation of function template specialization 'boost::function<bool
(boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&)>::function<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
self_type(f).swap(*this);
^
In file included from ../reduced-example/reduced.cpp:3:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:182:19: note: in instantiation of function template specialization 'boost::function<bool
(boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
&)>::operator=<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
requested here
lhs.f = detail::bind_parser<Auto>(
^
/home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:230:13: note: in instantiation of function template specialization
'boost::spirit::qi::rule<boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned
long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > >, ident (), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>::define<mpl_::bool_<1>,
boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >' requested here
define<mpl::true_>(r, expr, traits::matches<qi::domain, Expr>());
^
../reduced-example/reduced.cpp:23:9: note: in instantiation of function template specialization 'boost::spirit::qi::operator%=<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >'
requested here
start %= lexer.identifier;
^
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我最终意识到我定义的结构实际上是作为元组使用的。因为 Spirit 会尝试最小化组(例如,
可选
是一个可选
)。因此,我猜测tuple
将被转换为A
。情况似乎确实如此。我能够将损坏代码的测试用例进一步减少为以下内容:
来自以下邮件列表帖子 (1, 2),我发现,我可以通过执行以下操作来解决这个问题:
虽然不是很优雅,但它解决了至少这个问题。如果其他人有一种方法来执行单元素结构,我会非常感兴趣。
I ended up realizing that the struct I defined is being used in spirit as a tuple. Because spirit will try to minimize the groups (like, an
optional<int, int>
is anoptional<int>
). Therefore, I guessed that atuple<A>
will be converted to anA
. Which seems to be the case.I was able to further reduce the test case of broken code to the following:
From the following mailing list postings (1, 2) that I found, I can work around this issue by doing:
While not really elegant, it solves the problem at least. If someone else has a method to do the single element struct, I'd be greatly interested though.