@@ -84,42 +84,92 @@ struct uri_grammar
8484 ipvfuture %=
8585qi::lit (' v' ) >> +qi::xdigit >>' .' >> +(unreserved | sub_delims |' :' );
8686
87+ ipv6addresses[0 ] %=qi::repeat (6 )[h16 >>' :' ] >> ls32;
88+ ipv6addresses[1 ] %=" ::" >>qi::repeat (5 )[h16 >>' :' ] >> ls32;
89+ ipv6addresses[2 ] %= -qi::raw[h16] >>" ::" >>qi::repeat (4 )[h16 >>' :' ]
90+ >> ls32;
91+ ipv6addresses[3 ] %= -qi::raw[h16] >>" ::" >>qi::repeat (3 )[h16 >>' :' ]
92+ >> ls32;
93+ ipv6addresses[4 ] %= -qi::raw[h16] >>" ::" >>qi::repeat (2 )[h16 >>' :' ]
94+ >> ls32;
95+ ipv6addresses[5 ] %= -qi::raw[h16] >>" ::" >> h16 >>' :' >> ls32;
96+ ipv6addresses[6 ] %= -qi::raw[h16] >>" ::" >> ls32;
97+ ipv6addresses[7 ] %= -qi::raw[h16] >>" ::" >> h16;
98+ ipv6addresses[8 ] %= -qi::raw[h16] >>" ::" ;
99+ ipv6addresses[9 ] %= -qi::raw[qi::repeat (1 )[(h16 >>' :' )] >> h16] >>
100+ " ::" >>qi::repeat (3 )[h16 >>' :' ] >> ls32;
101+ ipv6addresses[10 ] %= -qi::raw[qi::repeat (1 )[(h16 >>' :' )] >> h16] >>
102+ " ::" >>qi::repeat (2 )[h16 >>' :' ] >> ls32;
103+ ipv6addresses[11 ] %= -qi::raw[qi::repeat (1 )[(h16 >>' :' )] >> h16] >>
104+ " ::" >> h16 >>' :' >> ls32;
105+ ipv6addresses[12 ] %= -qi::raw[qi::repeat (1 )[(h16 >>' :' )] >> h16] >>
106+ " ::" >> ls32;
107+ ipv6addresses[13 ] %= -qi::raw[qi::repeat (1 )[(h16 >>' :' )] >> h16] >>
108+ " ::" >> h16;
109+ ipv6addresses[14 ] %= -qi::raw[qi::repeat (1 )[(h16 >>' :' )] >> h16] >>
110+ " ::" ;
111+ ipv6addresses[15 ] %= -qi::raw[qi::repeat (2 )[(h16 >>' :' )] >> h16] >>
112+ " ::" >>qi::repeat (2 )[h16 >>' :' ] >> ls32;
113+ ipv6addresses[16 ] %= -qi::raw[qi::repeat (2 )[(h16 >>' :' )] >> h16] >>
114+ " ::" >> h16 >>' :' >> ls32;
115+ ipv6addresses[17 ] %= -qi::raw[qi::repeat (2 )[(h16 >>' :' )] >> h16] >>
116+ " ::" >> ls32;
117+ ipv6addresses[18 ] %= -qi::raw[qi::repeat (2 )[(h16 >>' :' )] >> h16] >>
118+ " ::" >> h16;
119+ ipv6addresses[19 ] %= -qi::raw[qi::repeat (2 )[(h16 >>' :' )] >> h16] >>
120+ " ::" ;
121+ ipv6addresses[20 ] %= -qi::raw[qi::repeat (3 )[(h16 >>' :' )] >> h16] >>
122+ " ::" >> h16 >>' :' >> ls32;
123+ ipv6addresses[21 ] %= -qi::raw[qi::repeat (3 )[(h16 >>' :' )] >> h16] >>
124+ " ::" >> ls32;
125+ ipv6addresses[22 ] %= -qi::raw[qi::repeat (3 )[(h16 >>' :' )] >> h16] >>
126+ " ::" >> h16;
127+ ipv6addresses[23 ] %= -qi::raw[qi::repeat (3 )[(h16 >>' :' )] >> h16] >>
128+ " ::" ;
129+ ipv6addresses[24 ] %= -qi::raw[qi::repeat (4 )[(h16 >>' :' )] >> h16] >>
130+ " ::" >> ls32;
131+ ipv6addresses[25 ] %= -qi::raw[qi::repeat (4 )[(h16 >>' :' )] >> h16] >>
132+ " ::" >> h16;
133+ ipv6addresses[26 ] %= -qi::raw[qi::repeat (4 )[(h16 >>' :' )] >> h16] >>
134+ " ::" ;
135+ ipv6addresses[27 ] %= -qi::raw[qi::repeat (5 )[(h16 >>' :' )] >> h16] >>
136+ " ::" >> h16;
137+ ipv6addresses[28 ] %= -qi::raw[qi::repeat (5 )[(h16 >>' :' )] >> h16] >>
138+ " ::" ;
139+ ipv6addresses[29 ] %= -qi::raw[qi::repeat (6 )[(h16 >>' :' )] >> h16] >>
140+ " ::" ;
141+
87142 ipv6address %= qi::raw
88- [qi::repeat (6 )[h16 >>' :' ] >> ls32 |
89- " ::" >>qi::repeat (5 )[h16 >>' :' ] >> ls32 |
90- -qi::raw[h16] >>" ::" >>qi::repeat (4 )[h16 >>' :' ] >> ls32 |
91- -qi::raw[h16] >>" ::" >>qi::repeat (3 )[h16 >>' :' ] >> ls32 |
92- -qi::raw[h16] >>" ::" >>qi::repeat (2 )[h16 >>' :' ] >> ls32 |
93- -qi::raw[h16] >>" ::" >> h16 >>' :' >> ls32 |
94- -qi::raw[h16] >>" ::" >> ls32 | -qi::raw[h16] >>" ::" >> h16 |
95- -qi::raw[h16] >>" ::" |
96- -qi::raw[qi::repeat (1 )[(h16 >>' :' )] >> h16] >>" ::" >>
97- qi::repeat (3 )[h16 >>' :' ] >> ls32 |
98- -qi::raw[qi::repeat (1 )[(h16 >>' :' )] >> h16] >>" ::" >>
99- qi::repeat (2 )[h16 >>' :' ] >> ls32 |
100- -qi::raw[qi::repeat (1 )[(h16 >>' :' )] >> h16] >>" ::" >> h16 >>
101- ' :' >> ls32 |
102- -qi::raw[qi::repeat (1 )[(h16 >>' :' )] >> h16] >>" ::" >> ls32 |
103- -qi::raw[qi::repeat (1 )[(h16 >>' :' )] >> h16] >>" ::" >> h16 |
104- -qi::raw[qi::repeat (1 )[(h16 >>' :' )] >> h16] >>" ::" |
105- -qi::raw[qi::repeat (2 )[(h16 >>' :' )] >> h16] >>" ::" >>
106- qi::repeat (2 )[h16 >>' :' ] >> ls32 |
107- -qi::raw[qi::repeat (2 )[(h16 >>' :' )] >> h16] >>" ::" >> h16 >>
108- ' :' >> ls32 |
109- -qi::raw[qi::repeat (2 )[(h16 >>' :' )] >> h16] >>" ::" >> ls32 |
110- -qi::raw[qi::repeat (2 )[(h16 >>' :' )] >> h16] >>" ::" >> h16 |
111- -qi::raw[qi::repeat (2 )[(h16 >>' :' )] >> h16] >>" ::" |
112- -qi::raw[qi::repeat (3 )[(h16 >>' :' )] >> h16] >>" ::" >> h16 >>
113- ' :' >> ls32 |
114- -qi::raw[qi::repeat (3 )[(h16 >>' :' )] >> h16] >>" ::" >> ls32 |
115- -qi::raw[qi::repeat (3 )[(h16 >>' :' )] >> h16] >>" ::" >> h16 |
116- -qi::raw[qi::repeat (3 )[(h16 >>' :' )] >> h16] >>" ::" |
117- -qi::raw[qi::repeat (4 )[(h16 >>' :' )] >> h16] >>" ::" >> ls32 |
118- -qi::raw[qi::repeat (4 )[(h16 >>' :' )] >> h16] >>" ::" >> h16 |
119- -qi::raw[qi::repeat (4 )[(h16 >>' :' )] >> h16] >>" ::" |
120- -qi::raw[qi::repeat (5 )[(h16 >>' :' )] >> h16] >>" ::" >> h16 |
121- -qi::raw[qi::repeat (5 )[(h16 >>' :' )] >> h16] >>" ::" |
122- -qi::raw[qi::repeat (6 )[(h16 >>' :' )] >> h16] >>" ::" ];
143+ [ipv6addresses[0 ] |
144+ ipv6addresses[1 ] |
145+ ipv6addresses[2 ] |
146+ ipv6addresses[3 ] |
147+ ipv6addresses[4 ] |
148+ ipv6addresses[5 ] |
149+ ipv6addresses[6 ] |
150+ ipv6addresses[7 ] |
151+ ipv6addresses[8 ] |
152+ ipv6addresses[9 ] |
153+ ipv6addresses[10 ] |
154+ ipv6addresses[11 ] |
155+ ipv6addresses[12 ] |
156+ ipv6addresses[13 ] |
157+ ipv6addresses[14 ] |
158+ ipv6addresses[15 ] |
159+ ipv6addresses[16 ] |
160+ ipv6addresses[17 ] |
161+ ipv6addresses[18 ] |
162+ ipv6addresses[19 ] |
163+ ipv6addresses[20 ] |
164+ ipv6addresses[21 ] |
165+ ipv6addresses[22 ] |
166+ ipv6addresses[23 ] |
167+ ipv6addresses[24 ] |
168+ ipv6addresses[25 ] |
169+ ipv6addresses[26 ] |
170+ ipv6addresses[27 ] |
171+ ipv6addresses[28 ] |
172+ ipv6addresses[29 ]];
123173
124174// ls32 = ( h16 ":" h16 ) / IPv4address
125175 ls32 %= (h16 >>' :' >> h16) | ipv4address;
@@ -178,6 +228,8 @@ struct uri_grammar
178228 ipv6address, ipvfuture, ip_literal;
179229
180230 qi::rule<const_iterator, string_type()> h16, ls32;
231+ qi::rule<const_iterator, string_type()> ipv6addresses[30 ];
232+
181233
182234 qi::rule<const_iterator, iterator_range<const_iterator>()> host, port;
183235