Re: Trying to sort out AST vs grammar mapped attributes
Michael Powell <[email protected]>
| Newsgroups | gmane.comp.parsers.spirit.general |
|---|---|
| Message-ID | <CAMEoF_G1tvf3WydwFPXdX5=aECNhBa-pMkEweEWmRw7E9wk=qA@mail.gmail.com> |
On Wed, Dec 20, 2017 at 4:32 PM, Michael Powell <[email protected]> wrote: > Hello, > > I've got a parser/AST composed something like this: > > https://wandbox.org/permlink/P4227jXxu9DvQThF I sorted it out. It seems to be a matter of having the appropriate intermediate structs/attributed-rules to capture the octets, addresses, etc. https://wandbox.org/permlink/HEz4qn3XQLmpWUAx Now just a matter of rinsing and repeating for additional IPv4 mapped alternatives. Cheers! > I am having difficulty mapping the attributes correctly. I'm not quite > sure why, perhaps that structure inheritance is not quite right? I > don't know exactly. > > Note this is handling the IPv4-mapped IPv6 addresses, the first phrase only: > > IPv6address = 6(h16 ":") ls32 // Don't care about the other > alternatives at the moment. > ls32 = IPv4address // Don't care about the natural IPv6 alternative > IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet > dec-octet = int(0, 255) > > http://www.ietf.org/rfc/rfc5954.txt > > Getting similar errors across platforms, i.e. Microsoft Visual Studio 2015. > > The most obvious answer is that I "flatten" the AST mapping, but I'd > really like to leverage what I've already got in my IPv4 grammars > mapping into IPv6. > > Thoughts? > > Best, > > Michael Powell > > The errors: > > In file included from > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/auxiliary/attr.hpp:18, > from > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/auxiliary.hpp:19, > from > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi.hpp:16, > from prog.cc:3: > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/detail/assign_to.hpp: > In instantiation of 'static void > boost::spirit::traits::assign_to_attribute_from_value<Attribute, T, > Enable>::call(const T_&, Attribute&, mpl_::false_) [with T_ = > std::__cxx11::basic_string<char>; Attribute = > client::ast::ipv4_mapped_address; T = > std::__cxx11::basic_string<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:171:17: > required from 'static void > boost::spirit::traits::assign_to_attribute_from_value<Attribute, T, > Enable>::call(const T&, Attribute&) [with Attribute = > client::ast::ipv4_mapped_address; T = > std::__cxx11::basic_string<char>; Enable = void]' > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/detail/assign_to.hpp:370:63: > required from 'void boost::spirit::traits::detail::assign_to(const > T&, Attribute&, mpl_::false_) [with T = > std::__cxx11::basic_string<char>; Attribute = > client::ast::ipv4_mapped_address; mpl_::false_ = mpl_::bool_<false>]' > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/detail/assign_to.hpp:393:26: > required from 'void boost::spirit::traits::assign_to(const T&, > Attribute&) [with T = std::__cxx11::basic_string<char>; Attribute = > client::ast::ipv4_mapped_address]' > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/detail/attributes.hpp:27:30: > required from 'static void > boost::spirit::qi::default_transform_attribute<Exposed, > Transformed>::post(Exposed&, const Transformed&) [with Exposed = > client::ast::ipv4_mapped_address; Transformed = > std::__cxx11::basic_string<char>]' > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/detail/attributes.hpp:165:75: > required from 'void boost::spirit::traits::post_transform(Exposed&, > const Transformed&) [with Exposed = client::ast::ipv4_mapped_address; > Transformed = std::__cxx11::basic_string<char>]' > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/nonterminal/rule.hpp:308:43: > [ skipping 12 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::sequence<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type, > boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::eoi_parser, > boost::fusion::nil_> > > >, 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<client::ast::ipv4_mapped_address&, > 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::sequence<boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::reference<const > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type, > boost::spirit::unused_type> >, > boost::fusion::cons<boost::spirit::qi::eoi_parser, > boost::fusion::nil_> > > >, 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<client::ast::ipv4_mapped_address&, > 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<client::ast::ipv4_mapped_address&, > 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::shift_right, > boost::proto::argsns_::list2<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right, > boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&, > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type, > boost::spirit::unused_type>&>, 2>&, const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, > boost::proto::argsns_::term<boost::spirit::tag::eoi>, 0>&>, 2>; > Iterator = __gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >; T1 = > client::ast::ipv4_mapped_address(); 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::shift_right, > boost::proto::argsns_::list2<const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right, > boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const > char*, std::__cxx11::basic_string<char> >, > std::__cxx11::basic_string<char>(), boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type>&, > boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >, boost::spirit::unused_type, > boost::spirit::unused_type, boost::spirit::unused_type, > boost::spirit::unused_type>&>, 2>&, const > boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, > boost::proto::argsns_::term<boost::spirit::tag::eoi>, 0>&>, 2>; > Iterator = __gnu_cxx::__normal_iterator<const char*, > std::__cxx11::basic_string<char> >; T1 = > client::ast::ipv4_mapped_address(); 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:123:20: required from here > /opt/wandbox/boost-1.65.1/gcc-head/include/boost/spirit/home/qi/detail/assign_to.hpp:153:20: > error: no matching function for call to > 'client::ast::ipv4_mapped_address::ipv4_mapped_address(const > std::__cxx11::basic_string<char>&)' > attr = static_cast<Attribute>(val); > ^~~~~~~~~~~~~~~~~~~~~~~~~~~ > prog.cc:38:9: note: candidate: > 'client::ast::ipv4_mapped_address::ipv4_mapped_address(const string&, > uint8_t, uint8_t, uint8_t, uint8_t)' > ipv4_mapped_address(std::string const& addr > ^~~~~~~~~~~~~~~~~~~ > prog.cc:38:9: note: candidate expects 5 arguments, 1 provided > prog.cc:36:9: note: candidate: > 'client::ast::ipv4_mapped_address::ipv4_mapped_address()' > ipv4_mapped_address() : ipv4_address(), _addr() {} > ^~~~~~~~~~~~~~~~~~~ > prog.cc:36:9: note: candidate expects 0 arguments, 1 provided > prog.cc:32:12: note: candidate: > 'client::ast::ipv4_mapped_address::ipv4_mapped_address(const > client::ast::ipv4_mapped_address&)' > struct ipv4_mapped_address : ipv4_address { > ^~~~~~~~~~~~~~~~~~~ > prog.cc:32:12: note: no known conversion for argument 1 from 'const > std::__cxx11::basic_string<char>' to 'const > client::ast::ipv4_mapped_address&' > prog.cc:32:12: note: candidate: > 'client::ast::ipv4_mapped_address::ipv4_mapped_address(client::ast::ipv4_mapped_address&&)' > prog.cc:32:12: note: no known conversion for argument 1 from 'const > std::__cxx11::basic_string<char>' to > 'client::ast::ipv4_mapped_address&&' ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot