Re: IPv6 address parsing
Michael Powell <[email protected]>
| Newsgroups | gmane.comp.parsers.spirit.general |
|---|---|
| Message-ID | <CAMEoF_FXM7gxp7mpVQEAFvKkmFxAME+e2CtWSUzds=ri44BuWQ@mail.gmail.com> |
I decided that it might make better sense to separate this into two parent grammars, one IPv4 mapped IPv6, and the other straight IPv6, each with its own AST. That way IPv4 is at least comparable along with the base IPv6 address. On Wed, Dec 6, 2017 at 6:15 PM, Michael Powell <[email protected]> wrote: > Hello, > > I'm moving on to IPv6 address parsing, which grammar is a super set, > sort of, of IPv4. > > Basically modeled after the IPv6 grammar, more or less. I am using the > digit-wise IPv4 parsing approach here instead of uint_parser, because > I need the entire string to parse, from what I understand, and > according to RFC 5954 section 4.1. > > I was also having difficulty getting "repeat" to work quite right. > > _dot = "."; > _col = ":"; > _col_x2 = "::"; > > /* TODO: TBD: This "may" work, except I really do not want to parse actual > INTEGERS, but rather them as STRINGS. */ > > // _dec_octet = uint_parser<std::uint8_t, 10, 1, 3>(); > > qi::rule<Iterator> _dec_octet = ( > char_('0') > | char_('1') >> -(digit >> -digit) > | char_('2') >> ( > char_('0', '4') >> -digit > | char_('5') >> -char_('0', '5') > | char_('6', '9') > ) > | char_('3', '9') >> -digit > ); > > qi::rule<Iterator> _ipv4_addr = _dec_octet >> repeat(3)[_dot >> _dec_octet]; > // or, qi::rule<Iterator> _ipv4_addr = _dec_octet >> _dot >> > _dec_octet >> _dot >> _dec_octet >> _dot >> _dec_octet; > > qi::rule<Iterator> _h16 = repeat(1, 4)[hex]; > //_h16 = hex >> -(hex >> -(hex >> -hex)); > qi::rule<Iterator> _h16_col = _h16 >> _col; > qi::rule<Iterator> _ls32 = _h16_col >> _h16 | _ipv4_addr; > > qi::rule<Iterator> _ipv6_addr > = repeat(6)[_h16_col] >> _ls32 > | _col_x2 >> repeat(5)[_h16_col] >> _ls32 > | -(_h16) >> _col_x2 >> repeat(4)[_h16_col] >> _ls32 > | -(_h16_col >> _h16) >> _col_x2 >> repeat(3)[_h16_col] >> _ls32 > | -(repeat(1, 2)[_h16_col] >> _h16) >> _col_x2 >> > repeat(2)[_h16_col] >> _ls32 > | -(repeat(1, 3)[_h16_col] >> _h16) >> _col_x2 >> _h16_col >> _ls32 > | -(repeat(1, 4)[_h16_col] >> _h16) >> _col_x2 >> _ls32 > | -(repeat(1, 5)[_h16_col] >> _h16) >> _col_x2 >> _h16 > | -(repeat(1, 6)[_h16_col] >> _h16) >> _col_x2 > ; > > qi::rule<Iterator> _start = _ipv6_addr >> eoi; > > ref: http://www.ietf.org/rfc/rfc5954.txt, section 4.1 Resolution for > Extra Colon in IPv4-Mapped IPv6 Address > > I'll cook up a web program example if necessary, just wanted to get > some initial feedback. > > Thoughts? > > Thanks! > > Regards, > > Michael Powell ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot