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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.