Re: Domain name parser not working
Michael Powell <[email protected]>
| Newsgroups | gmane.comp.parsers.spirit.general |
|---|---|
| Message-ID | <CAMEoF_G6con+_nL+Gcia+=9ew6r3UzfsD6xai89PoSdpBqeszg@mail.gmail.com> |
Now after providing additional follow up, live examples, etc, any feedback on this at all? This cannot be that difficult, however any of the documentation, etc, I am scanning does not seem to work or are incomplete at best, which isn't helping the case. Thanks! Cheers, Michael Powell On Mon, Jan 1, 2018 at 9:30 PM, Michael Powell <[email protected]> wrote: > 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