Re: Domain name parser not working
Michael Powell <[email protected]> Wed, 3 Jan 2018 09:39:30 -0500
| Newsgroups | gmane.comp.parsers.spirit.general |
|---|---|
| Message-ID | <CAMEoF_F8Sb82HTbsgkkyx3x6W+Tx0QNA-10O3m2Yy2jfDHSwEQ@mail.gmail.com> |
Problem settled as far as I'm concerned. Thanks so much for folks who responded. I ended up using typeid(...) to help discern a bit more detail about what Attrib actually is/was. I ended up going with raw[repeat(...)[...]], which yields a bit closer to std::string in the boost::iterator_range<std::string::const_iterator>, or boost::iterator_range<Iterator> (as provided to the Parser itself). But this also means it is closer to std::string, which I can work with to further validate than the base rule. Neither here nor there re: Boost.Spirit, but with a bit of refactoring, I can isolate the core label validation heuristics in a base class that extends not only into the semantic action function object, but also into the AST. Thanks again! Cheers, Michael Powell On Tue, Jan 2, 2018 at 11:13 PM, Michael Powell <[email protected]> wrote: > On Tue, Jan 2, 2018 at 11:08 PM, JF <[email protected]> wrote: >> 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. > > Incredible that. In this case I suppose with the happy coincidence (by > design) that vector<char> yields std::string() in produced by the rule > attribute. > >> 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 >> ------------------------------------------------------------------------------ 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