Re: Domain name parser not working
Michael Powell <[email protected]>
| Newsgroups | gmane.comp.parsers.spirit.general |
|---|---|
| Message-ID | <CAMEoF_E4XkUYOSU=S+BSip+NxYiM04Z9QHBX9E_wn5E8ttyF1w@mail.gmail.com> |
On Mon, Jan 1, 2018 at 9:20 PM, Michael Powell <[email protected]> wrote: > On Mon, Jan 1, 2018 at 8:59 PM, Michael Powell <[email protected]> wrote: >> On Mon, Jan 1, 2018 at 7:32 PM, Michael Powell <[email protected]> wrote: >>> On Mon, Jan 1, 2018 at 7:11 PM, Michael Powell <[email protected]> wrote: >>>> On Mon, Jan 1, 2018 at 6:49 PM, Michael Powell <[email protected]> wrote: >>>>> Hello, >>>>> >>>>> // Where Let is char_(/*upper/lower-case chars*/), Dig is >>>>> char_("0123456789"), Hyp is char_('.'), and dot_ is '.'. >>>>> >>>>> template<typename It> >>>>> struct DomainNameParser : boost::spirit::qi::grammar<It, Ast::Address()> { >>>>> >>>>> DomainNameParser() { >>>>> >>>>> _hyp = char_('-'); >>>>> _dig = char_(DOMAIN_NAME_PARSER_DIGITS); >>>>> _let = char_(DOMAIN_NAME_PARSER_LOWERCASE DOMAIN_NAME_PARSER_UPPERCASE); >>>>> >>>>> // A straight interpretation of the Domain Name grammar leads me to this: >>>>> /*qi::rule<It, std::string()>*/ _label = raw[_let >> -(*(_let | >>>>> _dig | _hyp) >> (_let | _dig))]; >>>>> /*qi::rule<It, Ast::Address()>*/ _start = (_label % dot_) >> eoi; >>>>> // ... >>>>> >>>>> } >>>>> }; >>>>> >>>>> Assuming, >>>>> >>>>> struct Address { >>>>> std::vector<std::string> _labels; >>>>> }; >>>>> >>>>> BOOST_FUSION_ADAPT_STRUCT(Ast::Address, >>>>> (std::vector<std::string>, _labels) >>>>> ) >>>>> >>>>> However, this is failing to match: "E-PHUMZ8G8j1KEZG26C" in spite of >>>>> the fact this matches the expected pattern. No skippers involved, just >>>>> the iterator (std::string::const_iterator), and the AST, of course. >>>>> >>>>> For now, dropping the semantic action until I can get the parser to >>>>> work properly. However, eventually I want to incorporate the >>>>> validation rule: >>>>> >>>>> struct label_validation { >>>>> // Notwithstanding Qi/Fusion bits that glue it together. >>>>> bool operator()(std::string const& l) const { >>>>> return l.length() <= 63; >>>>> } >>>>> }; >>>>> >>>>> Once again I am suspicious whether Optional is working properly, never >>>>> minding Kleene Star productions. I ended up needing to separate out >>>>> Alternative phrases instead of the Optional before in order to make it >>>>> work properly. >>>>> >>>>> Perhaps I need to capture each phrase in a rule of its own focused >>>>> solely on std::string or char, respectively, as contrasted with the >>>>> entire std::string? >>>> >>>> Here's an MRP: >>>> >>>> https://wandbox.org/permlink/cbpUPMnQ4APZeDdw >>> >>> I tried a little bit different version, IMO a little closer to the RFC >>> if not exactly: >>> >>> https://wandbox.org/permlink/1sDTqnFphTA2egDu >>> >>> Notwithstanding the roll up in to std::vector of std::string, and >>> ultimately ast::address. >>> >>>> More or less based on RFC 1034: https://tools.ietf.org/html/rfc1034#section-3.5 >>>> >>>> Thoughts? >> >> I decided to "simplify" in terms of the grammar rules themselves just a bit: >> >> https://wandbox.org/permlink/I6qWWxp3urd1Q9wD >> >> I figure the specifics of a grammatically correct label can be validated for: >> >> 1) specific content (first letter, last character, everything in between) >> 2) length of content >> >> With that in mind, it is possible to introduce semantic actions >> performing this label verification? Either two, or a single one >> performing both, if necessary. >> >> The Fusion functional strategy seems appealing, but I was unable to >> get that to work quite right at compile time. Willing consider other >> approaches to the same. > > Which, as soon as I approach a semantic action for purposes of > "simple" label length validation, in this case absurdly limited for > test purposes, I get the compiler errors. > > https://wandbox.org/permlink/CLCRxpWVFNMmS1Fk > > void validate_label(std::string const& l, boost::fusion::unused_type > const&, bool& pass) { > pass = l.length() < 4; > } > > // ... > > _label = (raw[_let >> -(*(_let | _dig | _hyp) >> (_let | > _dig))])[validate_label]; Even a function object does not work, modeled after the Qi documentation. I get similar errors. https://wandbox.org/permlink/XwkMAFESBdKQEhFE http://www.boost.org/doc/libs/1_66_0/libs/spirit/doc/html/spirit/qi/tutorials/semantic_actions.html struct label_validation { void operator()(std::string const& l, boost::fusion::unused_type const&, bool& pass) { pass = l.length() < 4; } }; Which only difference in usage, as far as I can tell, should be this: _label = (raw[_let >> -(*(_let | _dig | _hyp) >> (_let | _dig))])[label_validation()]; > The errors: > > In file included from > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/action/action.hpp:21, > from > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/action.hpp:14, > from > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi.hpp:14, > from prog.cc:3: > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/support/action_dispatch.hpp: > In instantiation of 'bool > boost::spirit::traits::action_dispatch<Component>::operator()(RT > (*)(A0, A1, A2), Attribute&, Context&) [with RT = void; A0 = const > std::__cxx11::basic_string<char>&; A1 = const > boost::fusion::unused_type&; A2 = bool&; Attribute = > boost::iterator_range<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> > >; Context = > boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char>&, > boost::fusion::nil_>, boost::fusion::vector<> >; Component = > boost::spirit::qi::raw_directive<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::optional<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > > > >, > boost::fusion::cons<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > >, boost::fusion::nil_> > > >, > boost::fusion::nil_> > > >]': > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/action/action.hpp:69:55: > required from 'bool boost::spirit::qi::action<Subject, > Action>::parse(Iterator&, const Iterator&, Context&, const Skipper&, > Attribute&) const [with Iterator = __gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >; Context = > boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char>&, > boost::fusion::nil_>, boost::fusion::vector<> >; Skipper = > boost::spirit::unused_type; Attribute = const > boost::spirit::unused_type; Subject = > boost::spirit::qi::raw_directive<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::optional<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > > > >, > boost::fusion::cons<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > >, boost::fusion::nil_> > > >, > boost::fusion::nil_> > > >; Action = void (&)(const > std::__cxx11::basic_string<char>&, const boost::fusion::unused_type&, > bool&)]' > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp:33:65: > required from 'bool boost::spirit::qi::detail::parser_binder<Parser, > Auto>::call(Iterator&, const Iterator&, Context&, const Skipper&, > mpl_::true_) const [with Iterator = __gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >; Skipper = > boost::spirit::unused_type; Context = > boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char>&, > boost::fusion::nil_>, boost::fusion::vector<> >; Parser = > boost::spirit::qi::action<boost::spirit::qi::raw_directive<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::optional<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > > > >, > boost::fusion::cons<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > >, boost::fusion::nil_> > > >, > boost::fusion::nil_> > > >, void (&)(const > std::__cxx11::basic_string<char>&, const boost::fusion::unused_type&, > bool&)>; Auto = mpl_::bool_<false>; mpl_::true_ = mpl_::bool_<true>]' > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp:53:67: > required from 'bool boost::spirit::qi::detail::parser_binder<Parser, > Auto>::operator()(Iterator&, const Iterator&, Context&, const > Skipper&) const [with Iterator = __gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >; Skipper = > boost::spirit::unused_type; Context = > boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char>&, > boost::fusion::nil_>, boost::fusion::vector<> >; Parser = > boost::spirit::qi::action<boost::spirit::qi::raw_directive<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::optional<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > > > >, > boost::fusion::cons<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > >, boost::fusion::nil_> > > >, > boost::fusion::nil_> > > >, void (&)(const > std::__cxx11::basic_string<char>&, const boost::fusion::unused_type&, > bool&)>; Auto = mpl_::bool_<false>]' > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/function/function_template.hpp:138:22: > required from 'static R > boost::detail::function::function_obj_invoker4<FunctionObj, R, T0, T1, > T2, T3>::invoke(boost::detail::function::function_buffer&, T0, T1, T2, > T3) [with FunctionObj = > boost::spirit::qi::detail::parser_binder<boost::spirit::qi::action<boost::spirit::qi::raw_directive<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::optional<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > > > >, > boost::fusion::cons<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > >, boost::fusion::nil_> > > >, > boost::fusion::nil_> > > >, void (&)(const > std::__cxx11::basic_string<char>&, const boost::fusion::unused_type&, > bool&)>, mpl_::bool_<false> >; R = bool; T0 = > __gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >&; T1 = const > __gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >&; T2 = > boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char>&, > boost::fusion::nil_>, boost::fusion::vector<> >&; T3 = const > boost::spirit::unused_type&]' > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/function/function_template.hpp:925:38: > [ skipping 2 instantiation contexts, use > -ftemplate-backtrace-limit=0 to disable ] > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/function/function_template.hpp:1061:16: > required from 'boost::function<R(T0, T1, T2, T3)>::function(Functor, > typename boost::enable_if_c<(! boost::is_integral<Functor>::value), > int>::type) [with Functor = > boost::spirit::qi::detail::parser_binder<boost::spirit::qi::action<boost::spirit::qi::raw_directive<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::optional<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > > > >, > boost::fusion::cons<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > >, boost::fusion::nil_> > > >, > boost::fusion::nil_> > > >, void (&)(const > std::__cxx11::basic_string<char>&, const boost::fusion::unused_type&, > bool&)>, mpl_::bool_<false> >; R = bool; T0 = > __gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >&; T1 = const > __gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >&; T2 = > boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char>&, > boost::fusion::nil_>, boost::fusion::vector<> >&; T3 = const > boost::spirit::unused_type&; typename boost::enable_if_c<(! > boost::is_integral<Functor>::value), int>::type = int]' > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/function/function_template.hpp:1114:5: > required from 'typename boost::enable_if_c<(! > boost::is_integral<Functor>::value), boost::function<R(T0, T1, T2, > T3)>&>::type boost::function<R(T0, T1, T2, T3)>::operator=(Functor) > [with Functor = > boost::spirit::qi::detail::parser_binder<boost::spirit::qi::action<boost::spirit::qi::raw_directive<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::optional<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > > > >, > boost::fusion::cons<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::nil_> > >, boost::fusion::nil_> > > >, > boost::fusion::nil_> > > >, void (&)(const > std::__cxx11::basic_string<char>&, const boost::fusion::unused_type&, > bool&)>, mpl_::bool_<false> >; R = bool; T0 = > __gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >&; T1 = const > __gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >&; T2 = > boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char>&, > boost::fusion::nil_>, boost::fusion::vector<> >&; T3 = const > boost::spirit::unused_type&; typename boost::enable_if_c<(! > boost::is_integral<Functor>::value), boost::function<R(T0, T1, T2, > T3)>&>::type = boost::function<bool(__gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >&, const > __gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >&, > boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char>&, > boost::fusion::nil_>, boost::fusion::vector<> >&, const > boost::spirit::unused_type&)>&]' > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/nonterminal/rule.hpp:183:19: > required from 'static void boost::spirit::qi::rule<Iterator, T1, T2, > T3, T4>::define(boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>&, > const Expr&, mpl_::true_) [with Auto = mpl_::bool_<false>; Expr = > boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, > boost::proto::argsns_::list2<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, > boost::proto::argsns_::list2<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, > boost::proto::argsns_::term<boost::spirit::tag::raw>, 0>&, const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right, > boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&, const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::negate, > boost::proto::argsns_::list1<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right, > boost::proto::argsns_::list2<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::dereference, > boost::proto::argsns_::list1<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, > boost::proto::argsns_::list2<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, > boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&, > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&>, 2>&, > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&>, 2>&>, 1>&, > const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, > boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&, > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&>, 2>&>, 2>&>, > 1>&>, 2>&>, 2>&, > boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, > boost::proto::argsns_::term<void (&)(const > std::__cxx11::basic_string<char>&, const boost::fusion::unused_type&, > bool&)>, 0> >, 2>; Iterator = __gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >; T1 = > std::__cxx11::basic_string<char>(); T2 = boost::spirit::unused_type; > T3 = boost::spirit::unused_type; T4 = boost::spirit::unused_type; > mpl_::true_ = mpl_::bool_<true>]' > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/nonterminal/rule.hpp:221:32: > required from 'boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>& > boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>::operator=(const > Expr&) [with Expr = > boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, > boost::proto::argsns_::list2<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, > boost::proto::argsns_::list2<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, > boost::proto::argsns_::term<boost::spirit::tag::raw>, 0>&, const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right, > boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&, const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::negate, > boost::proto::argsns_::list1<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right, > boost::proto::argsns_::list2<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::dereference, > boost::proto::argsns_::list1<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, > boost::proto::argsns_::list2<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, > boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&, > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&>, 2>&, > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&>, 2>&>, 1>&, > const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, > boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&, > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&>, 2>&>, 2>&>, > 1>&>, 2>&>, 2>&, > boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, > boost::proto::argsns_::term<void (&)(const > std::__cxx11::basic_string<char>&, const boost::fusion::unused_type&, > bool&)>, 0> >, 2>; Iterator = __gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >; T1 = > std::__cxx11::basic_string<char>(); T2 = boost::spirit::unused_type; > T3 = boost::spirit::unused_type; T4 = boost::spirit::unused_type]' > prog.cc:71:20: required from > 'client::my_grammar<Iterator>::my_grammar() [with Iterator = > __gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >]' > prog.cc:117:20: required from here > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/support/action_dispatch.hpp:189:14: > error: invalid initialization of reference of type 'const > std::__cxx11::basic_string<char>&' from expression of type > 'boost::iterator_range<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> > >' > f(attr, context, pass); > ~^~~~~~~~~~~~~~~~~~~~~ > > >>>> Cheers, >>>> >>>> Michael >>>> >>>>> Cheers, >>>>> >>>>> Michael Powell ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot