Re: Domain name parser not working

JF <[email protected]> Wed, 03 Jan 2018 04:08:40 +0000
Newsgroups gmane.comp.parsers.spirit.general
Message-ID <CACYgyeL-wwz_1YZX-1duR5cHKvGBBEFLLUQY2qfcxoKX2bSMCQ@mail.gmail.com>
See
http://www.boost.org/doc/libs/1_66_0/libs/spirit/doc/html/spirit/qi/quick_reference/compound_attribute_rules.html
and for example
http://www.boost.org/doc/libs/1_66_0/libs/spirit/doc/html/spirit/qi/reference/directive/repeat.html
.

In case of repeat the attribute is vector, for raw it is iterator_range,
etc.

Dne st 3. 1. 2018 5:00 uživatel Michael Powell <[email protected]>
napsal:

> On Tue, Jan 2, 2018 at 10:56 PM, Michael Powell <[email protected]>
> wrote:
> > On Tue, Jan 2, 2018 at 10:19 PM, JF <[email protected]>
> wrote:
> >> With semantic action you must use %= instead of =
> >>
> >> _label %= repeat(1, 63)[_let_dig_hyp][label_validation()]
> >
> > Ah! Did not know that. And it works, PASS. Thanks so much!
>
> Then the question is, I'd like to do some more validation on Attrib
> via the semantic action, but I don't know what it is. It seems like it
> should be a std::string, but I don't think it is, or is it a vector?
>
> >> Dne st 3. 1. 2018 4:15 uživatel Michael Powell <[email protected]>
> >> napsal:
> >>>
> >>> At this point I'm just scratching my head. I don't know what gives.
> >>>
> >>> https://wandbox.org/permlink/HewnazbGgXqixP0N
> >>>
> >>> It builds, but I get failure as long as the semantic action is in play.
> >>>
> >>> On the plus side, it is FAIL, not Failure, which means that a parse
> >>> did try to happen, but the resulting attribute was clearly incorrect.
> >>>
> >>> But when I remove the semantic action, I get PASS.
> >>>
> >>>
> >>> On Tue, Jan 2, 2018 at 10:02 PM, Michael Powell <[email protected]
> >
> >>> wrote:
> >>> > Then I just get this. What other options are you specifying? Compiler
> >>> > definitions?
> >>> >
> >>> > I'm not sure why l.size()? Shouldn't Attrib in this instance be
> >>> > std::string?
> >>> >
> >>> > In file included from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/support/string_traits.hpp:16,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/support/nonterminal/expand_arg.hpp:20,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/support/context.hpp:18,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/domain.hpp:18,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/meta_compiler.hpp:15,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/action/action.hpp:14,
> >>> >                  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/container.hpp:
> >>> > In instantiation of 'static bool
> >>> > boost::spirit::traits::push_back_container<Container, T,
> >>> > Enable>::call(Container&, const T&) [with Container =
> >>> > std::__cxx11::basic_string<char>; T = std::vector<char,
> >>> > std::allocator<char> >; Enable = void]':
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/support/container.hpp:354:55:
> >>> >   required from 'bool boost::spirit::traits::push_back(Container&,
> >>> > const T&) [with Container = std::__cxx11::basic_string<char>; T =
> >>> > std::vector<char, std::allocator<char> >]'
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/detail/assign_to.hpp:272:34:
> >>> >   required from 'static void
> >>> > boost::spirit::traits::assign_to_container_from_value<Attribute, T,
> >>> > Enable>::append_to_container_not_string(const T_&, Attribute&,
> >>> > mpl_::false_) [with T_ = std::vector<std::vector<char,
> >>> > std::allocator<char> >, std::allocator<std::vector<char,
> >>> > std::allocator<char> > > >; Attribute =
> >>> > std::__cxx11::basic_string<char>; T = std::vector<std::vector<char,
> >>> > std::allocator<char> >, std::allocator<std::vector<char,
> >>> > std::allocator<char> > > >; Enable = void; mpl_::false_ =
> >>> > mpl_::bool_<false>]'
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/detail/assign_to.hpp:282:43:
> >>> >   required from 'static void
> >>> > boost::spirit::traits::assign_to_container_from_value<Attribute, T,
> >>> > Enable>::call(const T_&, Attribute&, mpl_::true_, mpl_::false_) [with
> >>> > T_ = std::vector<std::vector<char, std::allocator<char> >,
> >>> > std::allocator<std::vector<char, std::allocator<char> > > >;
> Attribute
> >>> > = std::__cxx11::basic_string<char>; T = std::vector<std::vector<char,
> >>> > std::allocator<char> >, std::allocator<std::vector<char,
> >>> > std::allocator<char> > > >; Enable = void; mpl_::true_ =
> >>> > mpl_::bool_<true>; mpl_::false_ = mpl_::bool_<false>]'
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/detail/assign_to.hpp:326:17:
> >>> >   required from 'static void
> >>> > boost::spirit::traits::assign_to_container_from_value<Attribute, T,
> >>> > Enable>::call(const T&, Attribute&) [with Attribute =
> >>> > std::__cxx11::basic_string<char>; T = std::vector<std::vector<char,
> >>> > std::allocator<char> >, std::allocator<std::vector<char,
> >>> > std::allocator<char> > > >; Enable = void]'
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/detail/assign_to.hpp:379:63:
> >>> >   required from 'void boost::spirit::traits::detail::assign_to(const
> >>> > T&, Attribute&, mpl_::true_) [with T = std::vector<std::vector<char,
> >>> > std::allocator<char> >, std::allocator<std::vector<char,
> >>> > std::allocator<char> > > >; Attribute =
> >>> > std::__cxx11::basic_string<char>; mpl_::true_ = mpl_::bool_<true>]'
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/detail/assign_to.hpp:393:26:
> >>> >   [ skipping 8 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::repeat_parser<boost::spirit::qi::plus<boost::spirit::qi::reference<const
> >>> > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*,
> >>> > std::__cxx11::basic_string<char> >, char(),
> >>> > boost::spirit::unused_type, boost::spirit::unused_type,
> >>> > boost::spirit::unused_type> > >,
> >>> > boost::spirit::qi::finite_iterator<int> >, client::label_validation>,
> >>> > mpl_::bool_<true> >; 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::repeat_parser<boost::spirit::qi::plus<boost::spirit::qi::reference<const
> >>> > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*,
> >>> > std::__cxx11::basic_string<char> >, char(),
> >>> > boost::spirit::unused_type, boost::spirit::unused_type,
> >>> > boost::spirit::unused_type> > >,
> >>> > boost::spirit::qi::finite_iterator<int> >, client::label_validation>,
> >>> > mpl_::bool_<true> >; 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_<true>; 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<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
> >>> >
> >>> >
> boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::repeat,
> >>> > boost::fusion::vector<int, int> > >, 0>&, const
> >>> > boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus,
> >>> >
> >>> >
> boost::proto::argsns_::list1<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const
> >>> > char*, std::__cxx11::basic_string<char> >, char(),
> >>> > boost::spirit::unused_type, boost::spirit::unused_type,
> >>> > boost::spirit::unused_type>&>, 1>&>, 2>&,
> >>> > boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
> >>> > boost::proto::argsns_::term<const client::label_validation&>, 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:247:31:
> >>> >   required from 'boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>&
> >>> > boost::spirit::qi::operator%=(boost::spirit::qi::rule<Iterator, T1,
> >>> > T2, T3, T4>&, Expr&&) [with Expr = const
> >>> > 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<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
> >>> >
> >>> >
> boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::repeat,
> >>> > boost::fusion::vector<int, int> > >, 0>&, const
> >>> > boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus,
> >>> >
> >>> >
> boost::proto::argsns_::list1<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const
> >>> > char*, std::__cxx11::basic_string<char> >, char(),
> >>> > boost::spirit::unused_type, boost::spirit::unused_type,
> >>> > boost::spirit::unused_type>&>, 1>&>, 2>&,
> >>> > boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
> >>> > boost::proto::argsns_::term<const client::label_validation&>, 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:78:20:   required from
> >>> > 'client::my_grammar<Iterator>::my_grammar() [with Iterator =
> >>> > __gnu_cxx::__normal_iterator<const char*,
> >>> > std::__cxx11::basic_string<char> >]'
> >>> > prog.cc:128:20:   required from here
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/support/container.hpp:292:13:
> >>> > error: no matching function for call to
> >>> >
> >>> >
> 'std::__cxx11::basic_string<char>::insert(std::__cxx11::basic_string<char>::iterator,
> >>> > const std::vector<char, std::allocator<char> >&)'
> >>> >              c.insert(c.end(), val);
> >>> >              ^
> >>> > In file included from
> /opt/wandbox/gcc-head/include/c++/8.0.0/string:52,
> >>> >                  from
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/stdexcept:39,
> >>> >                  from
> /opt/wandbox/gcc-head/include/c++/8.0.0/array:39,
> >>> >                  from
> /opt/wandbox/gcc-head/include/c++/8.0.0/tuple:39,
> >>> >                  from
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/functional:54,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/support/detail/as_fusion_element.hpp:15,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/algorithm/transformation/push_back.hpp:11,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/view/iterator_range/detail/segmented_iterator_range.hpp:21,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/view/iterator_range/detail/segments_impl.hpp:14,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/view/iterator_range/iterator_range.hpp:22,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/view/iterator_range.hpp:11,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/sequence/intrinsic/detail/segmented_begin.hpp:13,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/sequence/intrinsic/begin.hpp:18,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/adapted/boost_tuple/detail/convert_impl.hpp:12,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/adapted/boost_tuple.hpp:20,
> >>> >                  from
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/adapted.hpp:15,
> >>> >                  from prog.cc:2:
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1514:7:
> >>> > note: candidate: 'std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::iterator std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::const_iterator, std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::size_type, _CharT) [with _CharT = char; _Traits =
> >>> > std::char_traits<char>; _Alloc = std::allocator<char>;
> >>> > std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator =
> >>> > __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char>
> >>> >>; typename __gnu_cxx::__alloc_traits<typename
> >>> > __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::pointer =
> >>> > char*; std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::const_iterator = __gnu_cxx::__normal_iterator<const char*,
> >>> > std::__cxx11::basic_string<char> >; typename
> >>> > __gnu_cxx::__alloc_traits<typename
> >>> >
> __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::const_pointer
> >>> > = const char*; std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::size_type = long unsigned int]'
> >>> >        insert(const_iterator __p, size_type __n, _CharT __c)
> >>> >        ^~~~~~
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1514:7:
> >>> > note:   candidate expects 3 arguments, 2 provided
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1558:9:
> >>> > note: candidate: 'template<class _InputIterator, class>
> >>> > std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator
> >>> > std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::const_iterator, _InputIterator, _InputIterator) [with
> >>> > _InputIterator = _InputIterator; <template-parameter-2-2> =
> >>> > <template-parameter-1-2>; _CharT = char; _Traits =
> >>> > std::char_traits<char>; _Alloc = std::allocator<char>]'
> >>> >          insert(const_iterator __p, _InputIterator __beg,
> _InputIterator
> >>> > __end)
> >>> >          ^~~~~~
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1558:9:
> >>> > note:   template argument deduction/substitution failed:
> >>> > In file included from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/support/string_traits.hpp:16,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/support/nonterminal/expand_arg.hpp:20,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/support/context.hpp:18,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/domain.hpp:18,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/meta_compiler.hpp:15,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/action/action.hpp:14,
> >>> >                  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/container.hpp:292:13:
> >>> > note:   candidate expects 3 arguments, 2 provided
> >>> >              c.insert(c.end(), val);
> >>> >              ^
> >>> > In file included from
> /opt/wandbox/gcc-head/include/c++/8.0.0/string:52,
> >>> >                  from
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/stdexcept:39,
> >>> >                  from
> /opt/wandbox/gcc-head/include/c++/8.0.0/array:39,
> >>> >                  from
> /opt/wandbox/gcc-head/include/c++/8.0.0/tuple:39,
> >>> >                  from
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/functional:54,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/support/detail/as_fusion_element.hpp:15,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/algorithm/transformation/push_back.hpp:11,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/view/iterator_range/detail/segmented_iterator_range.hpp:21,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/view/iterator_range/detail/segments_impl.hpp:14,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/view/iterator_range/iterator_range.hpp:22,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/view/iterator_range.hpp:11,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/sequence/intrinsic/detail/segmented_begin.hpp:13,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/sequence/intrinsic/begin.hpp:18,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/adapted/boost_tuple/detail/convert_impl.hpp:12,
> >>> >                  from
> >>> >
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/adapted/boost_tuple.hpp:20,
> >>> >                  from
> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/fusion/adapted.hpp:15,
> >>> >                  from prog.cc:2:
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1592:7:
> >>> > note: candidate: 'void std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::iterator, std::initializer_list<_Tp>) [with _CharT = char;
> >>> > _Traits = std::char_traits<char>; _Alloc = std::allocator<char>;
> >>> > std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator =
> >>> > __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char>
> >>> >>; typename __gnu_cxx::__alloc_traits<typename
> >>> > __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::pointer =
> >>> > char*]'
> >>> >        insert(iterator __p, initializer_list<_CharT> __l)
> >>> >        ^~~~~~
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1592:7:
> >>> > note:   no known conversion for argument 2 from 'const
> >>> > std::vector<char, std::allocator<char> >' to
> >>> > 'std::initializer_list<char>'
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1612:7:
> >>> > note: candidate: 'std::__cxx11::basic_string<_CharT, _Traits,
> _Alloc>&
> >>> > std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::size_type, const std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>;
> >>> > _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT,
> >>> > _Traits, _Alloc>::size_type = long unsigned int]'
> >>> >        insert(size_type __pos1, const basic_string& __str)
> >>> >        ^~~~~~
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1612:7:
> >>> > note:   no known conversion for argument 1 from
> >>> > 'std::__cxx11::basic_string<char>::iterator' {aka
> >>> > '__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char>
> >>> >>'} to 'std::__cxx11::basic_string<char>::size_type' {aka 'long
> >>> > unsigned int'}
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1635:7:
> >>> > note: candidate: 'std::__cxx11::basic_string<_CharT, _Traits,
> _Alloc>&
> >>> > std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::size_type, const std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>&, std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::size_type, std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::size_type) [with _CharT = char; _Traits =
> >>> > std::char_traits<char>; _Alloc = std::allocator<char>;
> >>> > std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long
> >>> > unsigned int]'
> >>> >        insert(size_type __pos1, const basic_string& __str,
> >>> >        ^~~~~~
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1635:7:
> >>> > note:   candidate expects 4 arguments, 2 provided
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1658:7:
> >>> > note: candidate: 'std::__cxx11::basic_string<_CharT, _Traits,
> _Alloc>&
> >>> > std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::size_type, const _CharT*, std::__cxx11::basic_string<_CharT,
> >>> > _Traits, _Alloc>::size_type) [with _CharT = char; _Traits =
> >>> > std::char_traits<char>; _Alloc = std::allocator<char>;
> >>> > std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long
> >>> > unsigned int]'
> >>> >        insert(size_type __pos, const _CharT* __s, size_type __n)
> >>> >        ^~~~~~
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1658:7:
> >>> > note:   candidate expects 3 arguments, 2 provided
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1677:7:
> >>> > note: candidate: 'std::__cxx11::basic_string<_CharT, _Traits,
> _Alloc>&
> >>> > std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::size_type, const _CharT*) [with _CharT = char; _Traits =
> >>> > std::char_traits<char>; _Alloc = std::allocator<char>;
> >>> > std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long
> >>> > unsigned int]'
> >>> >        insert(size_type __pos, const _CharT* __s)
> >>> >        ^~~~~~
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1677:7:
> >>> > note:   no known conversion for argument 1 from
> >>> > 'std::__cxx11::basic_string<char>::iterator' {aka
> >>> > '__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char>
> >>> >>'} to 'std::__cxx11::basic_string<char>::size_type' {aka 'long
> >>> > unsigned int'}
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1701:7:
> >>> > note: candidate: 'std::__cxx11::basic_string<_CharT, _Traits,
> _Alloc>&
> >>> > std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::size_type, std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::size_type, _CharT) [with _CharT = char; _Traits =
> >>> > std::char_traits<char>; _Alloc = std::allocator<char>;
> >>> > std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long
> >>> > unsigned int]'
> >>> >        insert(size_type __pos, size_type __n, _CharT __c)
> >>> >        ^~~~~~
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1701:7:
> >>> > note:   candidate expects 3 arguments, 2 provided
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1719:7:
> >>> > note: candidate: 'std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::iterator std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::__const_iterator, _CharT) [with _CharT = char; _Traits =
> >>> > std::char_traits<char>; _Alloc = std::allocator<char>;
> >>> > std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator =
> >>> > __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char>
> >>> >>; typename __gnu_cxx::__alloc_traits<typename
> >>> > __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::pointer =
> >>> > char*; std::__cxx11::basic_string<_CharT, _Traits,
> >>> > _Alloc>::__const_iterator = __gnu_cxx::__normal_iterator<const char*,
> >>> > std::__cxx11::basic_string<char> >; typename
> >>> > __gnu_cxx::__alloc_traits<typename
> >>> >
> __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::const_pointer
> >>> > = const char*]'
> >>> >        insert(__const_iterator __p, _CharT __c)
> >>> >        ^~~~~~
> >>> > /opt/wandbox/gcc-head/include/c++/8.0.0/bits/basic_string.h:1719:7:
> >>> > note:   no known conversion for argument 2 from 'const
> >>> > std::vector<char, std::allocator<char> >' to 'char'
> >>> >
> >>> >
> >>> > On Tue, Jan 2, 2018 at 9:55 PM, JF <[email protected]>
> wrote:
> >>> >> In your https://wandbox.org/permlink/nDoBOQGXzUhZ07Al:
> >>> >>
> >>> >> 1. Comment line 58.
> >>> >> 2. Change line 59 to "pass = l.size() < 63;"
> >>> >> 3. Change line 76 to "_label %= repeat(1,
> >>> >> 63)[_let_dig_hyp][label_validation()];"
> >>> >>
> >>> >> Result:
> >>> >>
> >>> >> Start
> >>> >>
> >>> >> Running with Boost version: '106501'
> >>> >> Parsing 'E-PHUMZ8G8j1KEZG26C' -> E-PHUMZ8G8j1KEZG26C (PASS)
> >>> >>
> >>> >> 0
> >>> >>
> >>> >> Finish
> >>> >>
> >>> >> 2018-01-03 3:28 GMT+01:00 Michael Powell <[email protected]>:
> >>> >>>
> >>> >>> On Tue, Jan 2, 2018 at 9:10 PM, Michael Powell <
> [email protected]>
> >>> >>> wrote:
> >>> >>> > On Tue, Jan 2, 2018 at 7:15 PM, JF <[email protected]
> >
> >>> >>> > wrote:
> >>> >>> >> Hi Michael,
> >>> >>> >> If I understand RFC correctly, is this what you want?
> >>> >>> >
> >>> >>> > Have you tried to compile this? I have tried this and received
> the
> >>> >>> > following errors:
> >>> >>>
> >>> >>> With oversimplified grammar, without the semantic action, the
> parser
> >>> >>> passes. With the semantic action, the parser fails.
> >>> >>>
> >>> >>> https://wandbox.org/permlink/hCcMbPzJnRYWLEnU
> >>> >>>
> >>> >>> Incidentally, I can leverage repeat(1, 63)[_let_dig_hyp] in this
> >>> >>> instance to vet the length aspects of a valid label. However,
> again,
> >>> >>> as soon as I inject the semantic action, boom, failure to parse.
> >>> >>>
> >>> >>> https://wandbox.org/permlink/nDoBOQGXzUhZ07Al
> >>> >>>
> >>> >>> I've followed the docs, as well as the proposed approach, to no
> avail.
> >>> >>>
> >>> >>> > https://wandbox.org/permlink/ATvd59XXSLbqB07s
> >>> >>> >
> >>> >>> > prog.cc: In instantiation of 'void
> >>> >>> > client::label_validation::operator()(Attrib&, Context&, bool&)
> const
> >>> >>> > [with Attrib =
> >>> >>> > 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<> >]':
> >>> >>> >
> >>> >>> >
> >>> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/support/action_dispatch.hpp:95:25:
> >>> >>> >   required from 'decltype (f(a, b, c))
> >>> >>> >
> >>> >>> >
> >>> >>> >
> boost::spirit::traits::action_dispatch<Component>::fwd_attrib_context_pass::operator()(F&&,
> >>> >>> > A&&, B&&, C&&, Rest&& ...) [with F = const
> >>> >>> > client::label_validation&;
> >>> >>> > A = boost::iterator_range<__gnu_cxx::__normal_iterator<const
> char*,
> >>> >>> > std::__cxx11::basic_string<char> > >&; B =
> >>> >>> >
> >>> >>> >
> >>> >>> >
> boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char>&,
> >>> >>> > boost::fusion::nil_>, boost::fusion::vector<> >&; C = bool&;
> Rest =
> >>> >>> > {}; Component =
> >>> >>> >
> >>> >>> >
> >>> >>> >
> boost::spirit::qi::raw_directive<boost::spirit::qi::plus<boost::spirit::qi::reference<const
> >>> >>> > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*,
> >>> >>> > std::__cxx11::basic_string<char> >, char(),
> >>> >>> > boost::spirit::unused_type, boost::spirit::unused_type,
> >>> >>> > boost::spirit::unused_type> > > >; decltype (f(a, b, c)) = void]'
> >>> >>> >
> >>> >>> >
> >>> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/support/action_dispatch.hpp:143:17:
> >>> >>> >   required from 'static void
> >>> >>> > boost::spirit::traits::action_dispatch<Component>::caller(F&&,
> A&&
> >>> >>> > ...) [with F = const client::label_validation&; A =
> >>> >>> > {boost::iterator_range<__gnu_cxx::__normal_iterator<const char*,
> >>> >>> > std::__cxx11::basic_string<char, std::char_traits<char>,
> >>> >>> > std::allocator<char> > > >&,
> >>> >>> >
> >>> >>> >
> >>> >>> >
> boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char,
> >>> >>> > std::char_traits<char>, std::allocator<char> >&,
> >>> >>> > boost::fusion::nil_>,
> >>> >>> > boost::fusion::vector<> >&, bool&}; Component =
> >>> >>> >
> >>> >>> >
> >>> >>> >
> boost::spirit::qi::raw_directive<boost::spirit::qi::plus<boost::spirit::qi::reference<const
> >>> >>> > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*,
> >>> >>> > std::__cxx11::basic_string<char> >, char(),
> >>> >>> > boost::spirit::unused_type, boost::spirit::unused_type,
> >>> >>> > boost::spirit::unused_type> > > >]'
> >>> >>> >
> >>> >>> >
> >>> >>> >
> /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/support/action_dispatch.hpp:153:19:
> >>> >>> >   required from 'bool
> >>> >>> >
> boost::spirit::traits::action_dispatch<Component>::operator()(const
> >>> >>> > F&, Attribute&, Context&) [with F = client::label_validation;
> >>> >>> > 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::plus<boost::spirit::qi::reference<const
> >>> >>> > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*,
> >>> >>> > std::__cxx11::basic_string<char> >, char(),
> >>> >>> > boost::spirit::unused_type, boost::spirit::unused_type,
> >>> >>> > boost::spirit::unused_type> > > >]'
> >>> >>> >
> >>> >>> >
> >>> >>> >
> /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::plus<boost::spirit::qi::reference<const
> >>> >>> > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*,
> >>> >>> > std::__cxx11::basic_string<char> >, char(),
> >>> >>> > boost::spirit::unused_type, boost::spirit::unused_type,
> >>> >>> > boost::spirit::unused_type> > > >; Action =
> >>> >>> > client::label_validation]'
> >>> >>> >
> >>> >>> >
> >>> >>> >
> /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::plus<boost::spirit::qi::reference<const
> >>> >>> > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*,
> >>> >>> > std::__cxx11::basic_string<char> >, char(),
> >>> >>> > boost::spirit::unused_type, boost::spirit::unused_type,
> >>> >>> > boost::spirit::unused_type> > > >, client::label_validation>;
> 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:
> >>> >>> >   [ skipping 4 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::plus<boost::spirit::qi::reference<const
> >>> >>> > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*,
> >>> >>> > std::__cxx11::basic_string<char> >, char(),
> >>> >>> > boost::spirit::unused_type, boost::spirit::unused_type,
> >>> >>> > boost::spirit::unused_type> > > >, client::label_validation>,
> >>> >>> > 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::plus<boost::spirit::qi::reference<const
> >>> >>> > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*,
> >>> >>> > std::__cxx11::basic_string<char> >, char(),
> >>> >>> > boost::spirit::unused_type, boost::spirit::unused_type,
> >>> >>> > boost::spirit::unused_type> > > >, client::label_validation>,
> >>> >>> > 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::unary_plus,
> >>> >>> >
> >>> >>> >
> >>> >>> >
> boost::proto::argsns_::list1<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const
> >>> >>> > char*, std::__cxx11::basic_string<char> >, char(),
> >>> >>> > boost::spirit::unused_type, boost::spirit::unused_type,
> >>> >>> > boost::spirit::unused_type>&>, 1>&>, 2>&,
> >>> >>> > boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
> >>> >>> > boost::proto::argsns_::term<const client::label_validation&>, 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::unary_plus,
> >>> >>> >
> >>> >>> >
> >>> >>> >
> boost::proto::argsns_::list1<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const
> >>> >>> > char*, std::__cxx11::basic_string<char> >, char(),
> >>> >>> > boost::spirit::unused_type, boost::spirit::unused_type,
> >>> >>> > boost::spirit::unused_type>&>, 1>&>, 2>&,
> >>> >>> > boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
> >>> >>> > boost::proto::argsns_::term<const client::label_validation&>, 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:79:20:   required from
> >>> >>> > 'client::my_grammar<Iterator>::my_grammar() [with Iterator =
> >>> >>> > __gnu_cxx::__normal_iterator<const char*,
> >>> >>> > std::__cxx11::basic_string<char> >]'
> >>> >>> > prog.cc:129:20:   required from here
> >>> >>> > prog.cc:58:20: error: 'class
> >>> >>> > boost::iterator_range<__gnu_cxx::__normal_iterator<const char*,
> >>> >>> > std::__cxx11::basic_string<char> > >' has no member named
> 'length'
> >>> >>> >            pass = l.length() < 63;
> >>> >>> >                   ~~^~~~~~
> >>> >>> >
> >>> >>> >
> >>> >>> >
> >>> >>> >> #include <boost/spirit/include/qi.hpp>
> >>> >>> >>
> >>> >>> >> namespace qi = boost::spirit::qi;
> >>> >>> >> namespace ascii = qi::ascii;
> >>> >>> >>
> >>> >>> >> template
> >>> >>> >> <
> >>> >>> >> typename Iterator
> >>> >>> >>>
> >>> >>> >> struct grammar : qi::grammar<Iterator,
> std::vector<std::string>()>
> >>> >>> >> {
> >>> >>> >> qi::rule<Iterator, std::vector<std::string>()> domain;
> >>> >>> >> qi::rule<Iterator, std::string()> label;
> >>> >>> >>
> >>> >>> >> grammar()
> >>> >>> >> : grammar::base_type(domain)
> >>> >>> >> {
> >>> >>> >> domain = label >> *('.' >> label);
> >>> >>> >> label %= qi::raw[ascii::alpha >> *(ascii::alnum |
> >>> >>> >> '-')][check_label()];
> >>> >>> >> }
> >>> >>> >>
> >>> >>> >> struct check_label
> >>> >>> >> {
> >>> >>> >> template
> >>> >>> >> <
> >>> >>> >> typename Attrib, typename Context
> >>> >>> >>>
> >>> >>> >> void operator()(Attrib &attr, Context &context, bool &pass)
> const
> >>> >>> >> {
> >>> >>> >> auto label_length = attr.size();
> >>> >>> >> auto last_char = attr[label_length - 1];
> >>> >>> >> if(label_length < 64 && std::isalnum(last_char))
> >>> >>> >> {
> >>> >>> >> pass = true;
> >>> >>> >> }
> >>> >>> >> else
> >>> >>> >> {
> >>> >>> >> pass = false;
> >>> >>> >> }
> >>> >>> >> }
> >>> >>> >> };
> >>> >>> >> };
> >>> >>> >>
> >>> >>> >> int main()
> >>> >>> >> {
> >>> >>> >> std::string input = "E-PHUMZ8G8j1KEZG26C.xx1.-";
> >>> >>> >>
> >>> >>> >> std::vector<std::string> domain;
> >>> >>> >>
> >>> >>> >> auto b = input.cbegin();
> >>> >>> >> auto e = input.cend();
> >>> >>> >>
> >>> >>> >> if(qi::parse(b, e, grammar<std::string::const_iterator>(),
> domain))
> >>> >>> >> {
> >>> >>> >> std::string d;
> >>> >>> >>
> >>> >>> >> for(const auto &label : domain)
> >>> >>> >> {
> >>> >>> >> if(!d.empty())
> >>> >>> >> {
> >>> >>> >> d += '.';
> >>> >>> >> }
> >>> >>> >>
> >>> >>> >> d += label;
> >>> >>> >> }
> >>> >>> >>
> >>> >>> >> std::cout << "matched " << d << '\n';
> >>> >>> >> if(b != e)
> >>> >>> >> {
> >>> >>> >> std::cout << "unmatched " << std::string(b, e) << '\n';
> >>> >>> >> }
> >>> >>> >> }
> >>> >>> >> else
> >>> >>> >> {
> >>> >>> >> std::cout << "nothing matched\n";
> >>> >>> >> }
> >>> >>> >> }
> >>> >>> >>
> >>> >>> >> ?
> >>> >>> >>
> >>> >>> >> (There may be errors... It's 1AM here.)
> >>> >>> >>
> >>> >>> >> J
> >>> >>> >>
> >>> >>> >> 2018-01-03 0:54 GMT+01:00 Joel de Guzman <[email protected]>:
> >>> >>> >>>
> >>> >>> >>> On 03/01/2018 6:59 AM, Michael Powell wrote:
> >>> >>> >>>>
> >>> >>> >>>> On Tue, Jan 2, 2018 at 3:24 PM, Joel de Guzman<
> [email protected]>
> >>> >>> >>>> wrote:
> >>> >>> >>>>>
> >>> >>> >>>>> On 02/01/2018 11:42 PM, Michael Powell wrote:
> >>> >>> >>>>>>
> >>> >>> >>>>>> 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.
> >>> >>> >>>>>
> >>> >>> >>>>>
> >>> >>> >>>>> Not sure. I know you presented some code, but is it minimal
> >>> >>> >>>>> enough?
> >>> >>> >>>>> To me, minimal code would look like something like the code
> >>> >>> >>>>> here:
> >>> >>> >>>>> http://boost-spirit.com/home/feedback-and-support/
> >>> >>> >>>>
> >>> >>> >>>> There is nothing I consider extraneous in the examples I
> >>> >>> >>>> presented.
> >>> >>> >>>> There is a test scaffold, the grammar, and the AST. It's all
> >>> >>> >>>> pretty
> >>> >>> >>>> clearly outlined in the examples. Anything more or other than
> >>> >>> >>>> that I
> >>> >>> >>>> would consider NOT minimal.
> >>> >>> >>>
> >>> >>> >>>
> >>> >>> >>> Give it some more effort. For example, focus on one exact
> problem.
> >>> >>> >>> The
> >>> >>> >>> very subject of this thread does not even convey any usable
> >>> >>> >>> information
> >>> >>> >>> other than "not working". Most often than not, I could distill
> >>> >>> >>> problematic
> >>> >>> >>> code to only a few lines --one or two rules is ideal. You do
> not
> >>> >>> >>> even
> >>> >>> >>> have to have grammars. Also, get rid of the scaffolding, etc.
> >>> >>> >>>
> >>> >>> >>> Again, you'll have better luck if the essence of your question
> can
> >>> >>> >>> be fully comprehended in one or two minutes. Do I need to study
> >>> >>> >>> RFC
> >>> >>> >>> 1034 to understand your problem? If not, then that information
> is
> >>> >>> >>> extraneous. If yes, then your issue requires too much
> investment
> >>> >>> >>> in
> >>> >>> >>> time (at least for me).
> >>> >>> >>>
> >>> >>> >>> Regards,
> >>> >>> >>> --
> >>> >>> >>> Joel de Guzman
> >>> >>> >>> http://www.ciere.com
> >>> >>> >>> http://boost-spirit.com
> >>> >>> >>> http://www.cycfi.com/
> >>> >>> >>>
> >>> >>> >>>
> >>> >>> >>>
> >>> >>> >>>
> >>> >>> >>>
> >>> >>> >>>
> ------------------------------------------------------------------------------
> >>> >>> >>> Check out the vibrant tech community on one of the world's most
> >>> >>> >>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> >>> >>> >>> _______________________________________________
> >>> >>> >>> Spirit-general mailing list
> >>> >>> >>> [email protected]
> >>> >>> >>> https://lists.sourceforge.net/lists/listinfo/spirit-general
> >>> >>> >>
> >>> >>> >>
> >>> >>> >>
> >>> >>> >>
> >>> >>> >>
> >>> >>> >>
> ------------------------------------------------------------------------------
> >>> >>> >> Check out the vibrant tech community on one of the world's most
> >>> >>> >> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> >>> >>> >> _______________________________________________
> >>> >>> >> Spirit-general mailing list
> >>> >>> >> [email protected]
> >>> >>> >> https://lists.sourceforge.net/lists/listinfo/spirit-general
> >>> >>> >>
> >>> >>>
> >>> >>>
> >>> >>>
> >>> >>>
> ------------------------------------------------------------------------------
> >>> >>> Check out the vibrant tech community on one of the world's most
> >>> >>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> >>> >>> _______________________________________________
> >>> >>> Spirit-general mailing list
> >>> >>> [email protected]
> >>> >>> https://lists.sourceforge.net/lists/listinfo/spirit-general
> >>> >>
> >>> >>
> >>> >>
> >>> >>
> >>> >>
> ------------------------------------------------------------------------------
> >>> >> Check out the vibrant tech community on one of the world's most
> >>> >> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> >>> >> _______________________________________________
> >>> >> Spirit-general mailing list
> >>> >> [email protected]
> >>> >> https://lists.sourceforge.net/lists/listinfo/spirit-general
> >>> >>
> >>>
> >>>
> >>>
> ------------------------------------------------------------------------------
> >>> Check out the vibrant tech community on one of the world's most
> >>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> >>> _______________________________________________
> >>> Spirit-general mailing list
> >>> [email protected]
> >>> https://lists.sourceforge.net/lists/listinfo/spirit-general
> >>
> >>
> >>
> ------------------------------------------------------------------------------
> >> Check out the vibrant tech community on one of the world's most
> >> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> >> _______________________________________________
> >> Spirit-general mailing list
> >> [email protected]
> >> https://lists.sourceforge.net/lists/listinfo/spirit-general
> >>
>
>
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Spirit-general mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/spirit-general
>

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

_______________________________________________
Spirit-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/spirit-general