Trying to sort out AST vs grammar mapped attributes

Michael Powell <[email protected]>
Newsgroups gmane.comp.parsers.spirit.general
Message-ID <CAMEoF_GLD6UjcsFxkfYx=HjZNSO02wUCVn1TtKTSvz=oUYv_dA@mail.gmail.com>
Hello,

I've got a parser/AST composed something like this:

https://wandbox.org/permlink/P4227jXxu9DvQThF

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