xref: /openbsd/gnu/usr.bin/perl/t/re/anyof.t (revision 09467b48)
1#!./perl
2
3use strict;
4use warnings;
5use utf8;
6
7# This tests that the ANYOF nodes generated by bracketed character classes are
8# as expected.  The representation of these is not guaranteed, and this test
9# may need to be updated if it changes.  But it is here to make sure that no
10# unexpected changes occur.  These could come from faulty generation of the
11# node, or faulty display of them (or both).  Because these causes come from
12# very different parts of the regex compiler, it is unlikely that a commit
13# would change both of them, so this test will adequately serve to test both.
14
15BEGIN {
16    chdir 't' if -d 't';
17    require './test.pl';
18    set_up_inc('../lib','.','../ext/re');
19    require Config; import Config;
20    skip_all('no re module') unless defined &DynaLoader::boot_DynaLoader;
21}
22
23# An array is used instead of a hash, so that the tests are carried out in the
24# order given by this file.  Even-numbered indices are the regexes to compile.
25# The next higher element is the expected compilation result.
26#
27# It is painful to port some of these to EBCDIC, as not only do the code point
28# numbers change (for those < 256), but the order changes, as the compiled
29# version is sorted by native code point order.  On EBCDIC, \r comes before
30# \n, and 'k' before "K', for example.  So, the tests where there are
31# differences are skipped on EBCDIC.  They are all at the beginning of the
32# array, and a special marker entry is used to delmit the boundary between
33# skipped and not skipped.
34#
35# NOTE:  If the pattern contains (?8) it will be upgraded to UTF-8 after
36#        stripping that
37
38# 2**32-1 or 2**64-1
39my $highest_cp_string = "F" x (($Config{uvsize} < 8) ? 8 : 16);
40
41my $next_highest_cp_string = $highest_cp_string =~ s/ F $ /E/xr;
42
43my $highest_cp = "\\x{$highest_cp_string}";
44my $next_highest_cp = "\\x{$next_highest_cp_string}";
45
46sub  get_compiled ($) {
47    # Convert platform-independent values to what is suitable for the
48    # platform
49
50    my $pattern = shift;
51
52    $pattern =~ s/\{INFTY\}/$highest_cp/g;
53    $pattern =~ s/\{INFTY_minus_1\}/$next_highest_cp/g;
54    my $use_utf8 = ($pattern =~ s/\Q(?8)//);
55
56    $pattern = "my \$a = '$pattern';";
57    $pattern .= "utf8::upgrade(\$a);" if $use_utf8;
58    $pattern .= "qr/\$a/";
59    my $actual_pattern = "use re qw(Debug COMPILE); $pattern";
60
61    my $result = fresh_perl($actual_pattern);
62    if ($? != 0) {  # Re-run so as to display STDERR.
63        fail($pattern);
64        fresh_perl($actual_pattern, { stderr => 0, verbose => 1 });
65        return;
66    }
67
68    # The Debug output will come back as a bunch of lines.  We are
69    # interested only in the line after /Final program/
70    my @lines = split /\n/, $result;
71    while (defined ($_ = shift @lines)) {
72        last if /Final program/;
73    }
74
75    $_ = shift @lines;
76
77    s/ \s* \( \d+ \) \s* //x;   # Get rid of the node branch
78    s/ ^ \s* \d+ : \s* //x;     # ... And the node number
79
80    # Use platform-independent values
81    s/$highest_cp_string/INFTY/g;
82    s/$next_highest_cp_string/INFTY_minus_1/g;
83
84    return $_;
85}
86
87# Note: EXACTish lowercases the hex; ANYOF uppercases, without braces
88
89my @tests = (
90    '[\xe0\xc0]' => 'EXACTFU <\\x{e0}>',
91    '[\xe1\xc1]' => 'EXACTFU <\\x{e1}>',
92    '[\xe2\xc2]' => 'EXACTFU <\\x{e2}>',
93    '[\xe3\xc3]' => 'EXACTFU <\\x{e3}>',
94    '[\xe4\xc4]' => 'EXACTFU <\\x{e4}>',
95    '[\xc5\xe5]' => 'ANYOF[\\xC5\\xE5]',
96    '[\xe6\xc6]' => 'EXACTFU <\\x{e6}>',
97    '[\xe7\xc7]' => 'EXACTFU <\\x{e7}>',
98    '[\xe8\xc8]' => 'EXACTFU <\\x{e8}>',
99    '[\xe9\xc9]' => 'EXACTFU <\\x{e9}>',
100    '[\xea\xca]' => 'EXACTFU <\\x{ea}>',
101    '[\xeb\xcb]' => 'EXACTFU <\\x{eb}>',
102    '[\xec\xcc]' => 'EXACTFU <\\x{ec}>',
103    '[\xee\xce]' => 'EXACTFU <\\x{ee}>',
104    '[\xef\xcf]' => 'EXACTFU <\\x{ef}>',
105    '[\xf0\xd0]' => 'EXACTFU <\\x{f0}>',
106    '[\xf1\xd1]' => 'EXACTFU <\\x{f1}>',
107    '[\xf2\xd2]' => 'EXACTFU <\\x{f2}>',
108    '[\xf3\xd3]' => 'EXACTFU <\\x{f3}>',
109    '[\xf4\xd4]' => 'EXACTFU <\\x{f4}>',
110    '[\xf5\xd5]' => 'EXACTFU <\\x{f5}>',
111    '[\xf6\xd6]' => 'EXACTFU <\\x{f6}>',
112    '[\xf8\xd8]' => 'EXACTFU <\\x{f8}>',
113    '[\xf9\xd9]' => 'EXACTFU <\\x{f9}>',
114    '[\xfa\xda]' => 'EXACTFU <\\x{fa}>',
115    '[\xfb\xdb]' => 'EXACTFU <\\x{fb}>',
116    '[\xfc\xdc]' => 'EXACTFU <\\x{fc}>',
117    '[\xfd\xdd]' => 'EXACTFU <\\x{fd}>',
118    '[\xfe\xde]' => 'EXACTFU <\\x{fe}>',
119
120    '[[{]' => 'ANYOFM[\[\{]',
121    '[^\S ]' => 'ANYOFD[\t\n\x0B\f\r{utf8}\x85\xA0][1680 2000-200A 2028-2029 202F 205F 3000]',
122    '[^\n\r]' => 'ANYOF[^\n\r][0100-INFTY]',
123    '[^\/\|,\$\%%\@\ \%"\<\>\:\#\&\*\{\}\[\]\(\)]' => 'ANYOF[^ "#$%&()*,/:<>@\[\]\{|\}][0100-INFTY]',
124    '[[:ascii:]]' => 'ANYOFM[\x00-\x7F]',
125    '[[:^ascii:]]' => 'NANYOFM[\x00-\x7F]',
126    '[[:^ascii:]\x{2C2}]' => 'NANYOFM[\x00-\x7F]',
127    '(?u)[[:ascii:]]' => 'ANYOFM[\x00-\x7F]',
128    '(?u)[[:^ascii:]]' => 'NANYOFM[\x00-\x7F]',
129    '(?a)[[:ascii:]]' => 'ANYOFM[\x00-\x7F]',
130    '(?a)[[:^ascii:]]' => 'NANYOFM[\x00-\x7F]',
131    '(?a)[[:^ascii:]\x{2C2}]' => 'NANYOFM[\x00-\x7F]',
132    '[[:cntrl:]]' => 'POSIXD[:cntrl:]',
133    '[^[:^print:][:^ascii:]]' => 'POSIXA[:print:]',
134    '[[:blank:]]' => 'POSIXD[:blank:]',
135    '[ [:blank:]]' => 'POSIXD[:blank:]',
136    '[_[:blank:]]' => 'ANYOFD[\t _{utf8}\xA0][1680 2000-200A 202F 205F 3000]',
137    '[_[:^blank:]]' => 'NPOSIXD[:blank:]',
138    '[\xA0[:^blank:]]' => 'ANYOF[^\t ][0100-167F 1681-1FFF 200B-202E 2030-205E 2060-2FFF 3001-INFTY]',
139    '(?d:[_[:^blank:]])' => 'NPOSIXD[:blank:]',
140    '[\x{07}-\x{0B}]' => 'ANYOF[\a\b\t\n\x0B]',
141    '(?il)[\x{212A}]' => 'ANYOFL{i}[{utf8 locale}Kk][212A]',
142    '(?il)(?[\x{212A}])' => 'ANYOFL{utf8-locale-reqd}[Kk][212A]',
143
144    '(?i)b[s]\xe0' => 'ANYOFM[Bb]',    # The s goes into a 2nd node
145
146    '[aA]' => 'ANYOFM[Aa]',
147    '[bB]' => 'ANYOFM[Bb]',
148    '[kK]' => 'ANYOFM[Kk]',
149
150    'ebcdic_ok_below_this_marker',
151
152    '(?i:[^:])' => 'NANYOFM[:]',
153
154    '[^\n]' => 'REG_ANY',
155
156    '[[:alpha:]]' => 'POSIXD[:alpha:]',
157    '[[:^alpha:]]' => 'NPOSIXD[:alpha:]',
158    '[[:^alpha:]\x{2C2}]' => 'NPOSIXU[:alpha:]',
159    '(?l)[[:alpha:]]' => 'POSIXL[:alpha:]',
160    '(?l)[[:^alpha:]]' => 'NPOSIXL[:alpha:]',
161    '(?l)[[:^alpha:]\x{2C2}]' => 'NPOSIXL[:alpha:]',
162    '(?u)[[:alpha:]]' => 'POSIXU[:alpha:]',
163    '(?u)[[:^alpha:]]' => 'NPOSIXU[:alpha:]',
164    '(?a)[[:alpha:]]' => 'POSIXA[:alpha:]',
165    '(?a)[[:^alpha:]]' => 'NPOSIXA[:alpha:]',
166    '(?a)[[:^alpha:]\x{2C2}]' => 'NPOSIXA[:alpha:]',
167    '[[:alpha:][:^alpha:]]' => 'SANY',
168    '[^[:alpha:][:^alpha:]]' => 'OPFAIL',
169    '(?l)[[:alpha:][:^alpha:]]' => 'SANY',
170    '(?l)[^[:alpha:][:^alpha:]]' => 'OPFAIL',
171    '(?u)[[:alpha:][:^alpha:]]' => 'SANY',
172    '(?u)[^[:alpha:][:^alpha:]]' => 'OPFAIL',
173    '(?a)[[:alpha:][:^alpha:]]' => 'SANY',
174    '(?a)[^[:alpha:][:^alpha:]]' => 'OPFAIL',
175    '[[:alnum:]]' => 'POSIXD[:alnum:]',
176    '[[:^alnum:]]' => 'NPOSIXD[:alnum:]',
177    '[[:^alnum:]\x{2C2}]' => 'NPOSIXU[:alnum:]',
178    '(?l)[[:alnum:]]' => 'POSIXL[:alnum:]',
179    '(?l)[[:^alnum:]]' => 'NPOSIXL[:alnum:]',
180    '(?l)[[:^alnum:]\x{2C2}]' => 'NPOSIXL[:alnum:]',
181    '(?u)[[:alnum:]]' => 'POSIXU[:alnum:]',
182    '(?u)[[:^alnum:]]' => 'NPOSIXU[:alnum:]',
183    '(?a)[[:alnum:]]' => 'POSIXA[:alnum:]',
184    '(?a)[[:^alnum:]]' => 'NPOSIXA[:alnum:]',
185    '(?a)[[:^alnum:]\x{2C2}]' => 'NPOSIXA[:alnum:]',
186    '[[:alnum:][:^alnum:]]' => 'SANY',
187    '[^[:alnum:][:^alnum:]]' => 'OPFAIL',
188    '(?l)[[:alnum:][:^alnum:]]' => 'SANY',
189    '(?l)[^[:alnum:][:^alnum:]]' => 'OPFAIL',
190    '(?u)[[:alnum:][:^alnum:]]' => 'SANY',
191    '(?u)[^[:alnum:][:^alnum:]]' => 'OPFAIL',
192    '(?a)[[:alnum:][:^alnum:]]' => 'SANY',
193    '(?a)[^[:alnum:][:^alnum:]]' => 'OPFAIL',
194    '(?l)[[:ascii:]]' => 'POSIXL[:ascii:]',
195    '(?l)[[:^ascii:]]' => 'NPOSIXL[:ascii:]',
196    '(?l)[[:^ascii:]\x{2C2}]' => 'NPOSIXL[:ascii:]',
197    '[[:ascii:][:^ascii:]]' => 'SANY',
198    '[^[:ascii:][:^ascii:]]' => 'OPFAIL',
199    '(?l)[[:ascii:][:^ascii:]]' => 'SANY',
200    '(?l)[^[:ascii:][:^ascii:]]' => 'OPFAIL',
201    '(?u)[[:ascii:][:^ascii:]]' => 'SANY',
202    '(?u)[^[:ascii:][:^ascii:]]' => 'OPFAIL',
203    '(?a)[[:ascii:][:^ascii:]]' => 'SANY',
204    '(?a)[^[:ascii:][:^ascii:]]' => 'OPFAIL',
205    '[[:^blank:]]' => 'NPOSIXD[:blank:]',
206    '[[:^blank:]\x{2C2}]' => 'NPOSIXU[:blank:]',
207    '(?l)[[:blank:]]' => 'POSIXL[:blank:]',
208    '(?l)[[:^blank:]]' => 'NPOSIXL[:blank:]',
209    '(?l)[[:^blank:]\x{2C2}]' => 'NPOSIXL[:blank:]',
210    '(?u)[[:blank:]]' => 'POSIXU[:blank:]',
211    '(?u)[[:^blank:]]' => 'NPOSIXU[:blank:]',
212    '(?a)[[:blank:]]' => 'POSIXA[:blank:]',
213    '(?a)[[:^blank:]]' => 'NPOSIXA[:blank:]',
214    '(?a)[[:^blank:]\x{2C2}]' => 'NPOSIXA[:blank:]',
215    '[[:blank:]]' => 'POSIXD[:blank:]',
216    '[[:blank:][:^blank:]]' => 'SANY',
217    '[^[:blank:][:^blank:]]' => 'OPFAIL',
218    '(?l)[[:blank:][:^blank:]]' => 'SANY',
219    '(?l)[^[:blank:][:^blank:]]' => 'OPFAIL',
220    '(?u)[[:blank:][:^blank:]]' => 'SANY',
221    '(?u)[^[:blank:][:^blank:]]' => 'OPFAIL',
222    '(?a)[[:blank:][:^blank:]]' => 'SANY',
223    '(?a)[^[:blank:][:^blank:]]' => 'OPFAIL',
224    '[[:^cntrl:]]' => 'NPOSIXD[:cntrl:]',
225    '[[:^cntrl:]\x{2C2}]' => 'NPOSIXU[:cntrl:]',
226    '(?l)[[:cntrl:]]' => 'POSIXL[:cntrl:]',
227    '(?l)[[:^cntrl:]]' => 'NPOSIXL[:cntrl:]',
228    '(?l)[[:^cntrl:]\x{2C2}]' => 'NPOSIXL[:cntrl:]',
229    '(?u)[[:cntrl:]]' => 'POSIXU[:cntrl:]',
230    '(?u)[[:^cntrl:]]' => 'NPOSIXU[:cntrl:]',
231    '(?a)[[:cntrl:]]' => 'POSIXA[:cntrl:]',
232    '(?a)[[:^cntrl:]]' => 'NPOSIXA[:cntrl:]',
233    '(?a)[[:^cntrl:]\x{2C2}]' => 'NPOSIXA[:cntrl:]',
234    '[[:cntrl:][:^cntrl:]]' => 'SANY',
235    '[^[:cntrl:][:^cntrl:]]' => 'OPFAIL',
236    '(?l)[[:cntrl:][:^cntrl:]]' => 'SANY',
237    '(?l)[^[:cntrl:][:^cntrl:]]' => 'OPFAIL',
238    '(?u)[[:cntrl:][:^cntrl:]]' => 'SANY',
239    '(?u)[^[:cntrl:][:^cntrl:]]' => 'OPFAIL',
240    '(?a)[[:cntrl:][:^cntrl:]]' => 'SANY',
241    '(?a)[^[:cntrl:][:^cntrl:]]' => 'OPFAIL',
242    '[[:digit:]]' => 'POSIXU[\d]',
243    '[[:^digit:]]' => 'NPOSIXU[\d]',
244    '[[:^digit:]\x{2C2}]' => 'NPOSIXU[\d]',
245    '(?l)[[:digit:]]' => 'POSIXL[\d]',
246    '(?l)[[:^digit:]]' => 'NPOSIXL[\d]',
247    '(?l)[[:^digit:]\x{2C2}]' => 'NPOSIXL[\d]',
248    '(?u)[[:digit:]]' => 'POSIXU[\d]',
249    '(?u)[[:^digit:]]' => 'NPOSIXU[\d]',
250    '(?a)[[:digit:]]' => 'POSIXA[\d]',
251    '(?a)[[:^digit:]]' => 'NPOSIXA[\d]',
252    '(?a)[[:^digit:]\x{2C2}]' => 'NPOSIXA[\d]',
253    '[[:digit:][:^digit:]]' => 'SANY',
254    '[^[:digit:][:^digit:]]' => 'OPFAIL',
255    '(?l)[[:digit:][:^digit:]]' => 'SANY',
256    '(?l)[^[:digit:][:^digit:]]' => 'OPFAIL',
257    '(?u)[[:digit:][:^digit:]]' => 'SANY',
258    '(?u)[^[:digit:][:^digit:]]' => 'OPFAIL',
259    '(?a)[[:digit:][:^digit:]]' => 'SANY',
260    '(?a)[^[:digit:][:^digit:]]' => 'OPFAIL',
261    '[[:graph:]]' => 'POSIXD[:graph:]',
262    '[[:^graph:]]' => 'NPOSIXD[:graph:]',
263    '[[:^graph:]\x{FFFF}]' => 'NPOSIXU[:graph:]',
264    '(?l)[[:graph:]]' => 'POSIXL[:graph:]',
265    '(?l)[[:^graph:]]' => 'NPOSIXL[:graph:]',
266    '(?l)[[:^graph:]\x{FFFF}]' => 'NPOSIXL[:graph:]',
267    '(?u)[[:graph:]]' => 'POSIXU[:graph:]',
268    '(?u)[[:^graph:]]' => 'NPOSIXU[:graph:]',
269    '(?a)[[:graph:]]' => 'POSIXA[:graph:]',
270    '(?a)[[:^graph:]]' => 'NPOSIXA[:graph:]',
271    '(?a)[[:^graph:]\x{FFFF}]' => 'NPOSIXA[:graph:]',
272    '[[:graph:][:^graph:]]' => 'SANY',
273    '[^[:graph:][:^graph:]]' => 'OPFAIL',
274    '(?l)[[:graph:][:^graph:]]' => 'SANY',
275    '(?l)[^[:graph:][:^graph:]]' => 'OPFAIL',
276    '(?u)[[:graph:][:^graph:]]' => 'SANY',
277    '(?u)[^[:graph:][:^graph:]]' => 'OPFAIL',
278    '(?a)[[:graph:][:^graph:]]' => 'SANY',
279    '(?a)[^[:graph:][:^graph:]]' => 'OPFAIL',
280    '[[:lower:]]' => 'POSIXD[:lower:]',
281    '[[:^lower:]]' => 'NPOSIXD[:lower:]',
282    '[[:^lower:]\x{2C2}]' => 'NPOSIXU[:lower:]',
283    '(?l)[[:lower:]]' => 'POSIXL[:lower:]',
284    '(?l)[[:^lower:]]' => 'NPOSIXL[:lower:]',
285    '(?l)[[:^lower:]\x{2C2}]' => 'NPOSIXL[:lower:]',
286    '(?u)[[:lower:]]' => 'POSIXU[:lower:]',
287    '(?u)[[:^lower:]]' => 'NPOSIXU[:lower:]',
288    '(?a)[[:lower:]]' => 'POSIXA[:lower:]',
289    '(?a)[[:^lower:]]' => 'NPOSIXA[:lower:]',
290    '(?a)[[:^lower:]\x{2C2}]' => 'NPOSIXA[:lower:]',
291    '[[:lower:][:^lower:]]' => 'SANY',
292    '[^[:lower:][:^lower:]]' => 'OPFAIL',
293    '(?l)[[:lower:][:^lower:]]' => 'SANY',
294    '(?l)[^[:lower:][:^lower:]]' => 'OPFAIL',
295    '(?u)[[:lower:][:^lower:]]' => 'SANY',
296    '(?u)[^[:lower:][:^lower:]]' => 'OPFAIL',
297    '(?a)[[:lower:][:^lower:]]' => 'SANY',
298    '(?a)[^[:lower:][:^lower:]]' => 'OPFAIL',
299    '[[:print:]]' => 'POSIXD[:print:]',
300    '[[:^print:]]' => 'NPOSIXD[:print:]',
301    '[[:^print:]\x{FFFF}]' => 'NPOSIXU[:print:]',
302    '(?l)[[:print:]]' => 'POSIXL[:print:]',
303    '(?l)[[:^print:]]' => 'NPOSIXL[:print:]',
304    '(?l)[[:^print:]\x{FFFF}]' => 'NPOSIXL[:print:]',
305    '(?u)[[:print:]]' => 'POSIXU[:print:]',
306    '(?u)[[:^print:]]' => 'NPOSIXU[:print:]',
307    '(?a)[[:print:]]' => 'POSIXA[:print:]',
308    '(?a)[[:^print:]]' => 'NPOSIXA[:print:]',
309    '(?a)[[:^print:]\x{FFFF}]' => 'NPOSIXA[:print:]',
310    '[[:print:][:^print:]]' => 'SANY',
311    '[^[:print:][:^print:]]' => 'OPFAIL',
312    '(?l)[[:print:][:^print:]]' => 'SANY',
313    '(?l)[^[:print:][:^print:]]' => 'OPFAIL',
314    '(?u)[[:print:][:^print:]]' => 'SANY',
315    '(?u)[^[:print:][:^print:]]' => 'OPFAIL',
316    '(?a)[[:print:][:^print:]]' => 'SANY',
317    '(?a)[^[:print:][:^print:]]' => 'OPFAIL',
318    '[[:punct:]]' => 'POSIXD[:punct:]',
319    '[[:^punct:]]' => 'NPOSIXD[:punct:]',
320    '[[:^punct:]\x{2C2}]' => 'NPOSIXU[:punct:]',
321    '(?l)[[:punct:]]' => 'POSIXL[:punct:]',
322    '(?l)[[:^punct:]]' => 'NPOSIXL[:punct:]',
323    '(?l)[[:^punct:]\x{2C2}]' => 'NPOSIXL[:punct:]',
324    '(?u)[[:punct:]]' => 'POSIXU[:punct:]',
325    '(?u)[[:^punct:]]' => 'NPOSIXU[:punct:]',
326    '(?a)[[:punct:]]' => 'POSIXA[:punct:]',
327    '(?a)[[:^punct:]]' => 'NPOSIXA[:punct:]',
328    '(?a)[[:^punct:]\x{2C2}]' => 'NPOSIXA[:punct:]',
329    '[[:punct:][:^punct:]]' => 'SANY',
330    '[^[:punct:][:^punct:]]' => 'OPFAIL',
331    '(?l)[[:punct:][:^punct:]]' => 'SANY',
332    '(?l)[^[:punct:][:^punct:]]' => 'OPFAIL',
333    '(?u)[[:punct:][:^punct:]]' => 'SANY',
334    '(?u)[^[:punct:][:^punct:]]' => 'OPFAIL',
335    '(?a)[[:punct:][:^punct:]]' => 'SANY',
336    '(?a)[^[:punct:][:^punct:]]' => 'OPFAIL',
337    '[[:space:]]' => 'POSIXD[\s]',
338    '[[:^space:]]' => 'NPOSIXD[\s]',
339    '[[:^space:]\x{2C2}]' => 'NPOSIXU[\s]',
340    '(?l)[[:space:]]' => 'POSIXL[\s]',
341    '(?l)[[:^space:]]' => 'NPOSIXL[\s]',
342    '(?l)[[:^space:]\x{2C2}]' => 'NPOSIXL[\s]',
343    '(?u)[[:space:]]' => 'POSIXU[\s]',
344    '(?u)[[:^space:]]' => 'NPOSIXU[\s]',
345    '(?a)[[:space:]]' => 'POSIXA[\s]',
346    '(?a)[[:^space:]]' => 'NPOSIXA[\s]',
347    '(?a)[[:^space:]\x{2C2}]' => 'NPOSIXA[\s]',
348    '[[:space:][:^space:]]' => 'SANY',
349    '[^[:space:][:^space:]]' => 'OPFAIL',
350    '(?l)[[:space:][:^space:]]' => 'SANY',
351    '(?l)[^[:space:][:^space:]]' => 'OPFAIL',
352    '(?u)[[:space:][:^space:]]' => 'SANY',
353    '(?u)[^[:space:][:^space:]]' => 'OPFAIL',
354    '(?a)[[:space:][:^space:]]' => 'SANY',
355    '(?a)[^[:space:][:^space:]]' => 'OPFAIL',
356    '[[:upper:]]' => 'POSIXD[:upper:]',
357    '[[:^upper:]]' => 'NPOSIXD[:upper:]',
358    '[[:^upper:]\x{2C2}]' => 'NPOSIXU[:upper:]',
359    '(?l)[[:upper:]]' => 'POSIXL[:upper:]',
360    '(?l)[[:^upper:]]' => 'NPOSIXL[:upper:]',
361    '(?l)[[:^upper:]\x{2C2}]' => 'NPOSIXL[:upper:]',
362    '(?u)[[:upper:]]' => 'POSIXU[:upper:]',
363    '(?u)[[:^upper:]]' => 'NPOSIXU[:upper:]',
364    '(?a)[[:upper:]]' => 'POSIXA[:upper:]',
365    '(?a)[[:^upper:]]' => 'NPOSIXA[:upper:]',
366    '(?a)[[:^upper:]\x{2C2}]' => 'NPOSIXA[:upper:]',
367    '[[:upper:][:^upper:]]' => 'SANY',
368    '[^[:upper:][:^upper:]]' => 'OPFAIL',
369    '(?l)[[:upper:][:^upper:]]' => 'SANY',
370    '(?l)[^[:upper:][:^upper:]]' => 'OPFAIL',
371    '(?u)[[:upper:][:^upper:]]' => 'SANY',
372    '(?u)[^[:upper:][:^upper:]]' => 'OPFAIL',
373    '(?a)[[:upper:][:^upper:]]' => 'SANY',
374    '(?a)[^[:upper:][:^upper:]]' => 'OPFAIL',
375    '[\v]' => 'POSIXU[\v]',
376    '[^\v]' => 'NPOSIXU[\v]',
377    '[\V\x{2C2}]' => 'NPOSIXU[\v]',
378    '(?l)[\v]' => 'POSIXU[\v]',
379    '(?l)[^\v]' => 'NPOSIXU[\v]',
380    '(?l)[\V\x{2C2}]' => 'NPOSIXU[\v]',
381    '(?u)[\v]' => 'POSIXU[\v]',
382    '(?u)[^\v]' => 'NPOSIXU[\v]',
383    '(?a)[\v]' => 'POSIXU[\v]',
384    '(?a)[^\v]' => 'NPOSIXU[\v]',
385    '(?a)[\V\x{2C2}]' => 'NPOSIXU[\v]',
386    '[\v\V]' => 'SANY',
387    '[^\v\V]' => 'OPFAIL',
388    '(?l)[\v\V]' => 'SANY',
389    '(?l)[^\v\V]' => 'OPFAIL',
390    '(?u)[\v\V]' => 'SANY',
391    '(?u)[^\v\V]' => 'OPFAIL',
392    '(?a)[\v\V]' => 'SANY',
393    '(?a)[^\v\V]' => 'OPFAIL',
394    '[[:word:]]' => 'POSIXD[\w]',
395    '[[:^word:]]' => 'NPOSIXD[\w]',
396    '[[:^word:]\x{2C2}]' => 'NPOSIXU[\w]',
397    '(?l)[[:word:]]' => 'POSIXL[\w]',
398    '(?l)[[:^word:]]' => 'NPOSIXL[\w]',
399    '(?l)[[:^word:]\x{2C2}]' => 'NPOSIXL[\w]',
400    '(?u)[[:word:]]' => 'POSIXU[\w]',
401    '(?u)[[:^word:]]' => 'NPOSIXU[\w]',
402    '(?a)[[:word:]]' => 'POSIXA[\w]',
403    '(?a)[[:^word:]]' => 'NPOSIXA[\w]',
404    '(?a)[[:^word:]\x{2C2}]' => 'NPOSIXA[\w]',
405    '[[:word:][:^word:]]' => 'SANY',
406    '[^[:word:][:^word:]]' => 'OPFAIL',
407    '(?l)[[:word:][:^word:]]' => 'SANY',
408    '(?l)[^[:word:][:^word:]]' => 'OPFAIL',
409    '(?u)[[:word:][:^word:]]' => 'SANY',
410    '(?u)[^[:word:][:^word:]]' => 'OPFAIL',
411    '(?a)[[:word:][:^word:]]' => 'SANY',
412    '(?a)[^[:word:][:^word:]]' => 'OPFAIL',
413    '[[:xdigit:]]' => 'POSIXU[:xdigit:]',
414    '[[:^xdigit:]]' => 'NPOSIXU[:xdigit:]',
415    '[[:^xdigit:]\x{2C2}]' => 'NPOSIXU[:xdigit:]',
416    '(?l)[[:xdigit:]]' => 'POSIXL[:xdigit:]',
417    '(?l)[[:^xdigit:]]' => 'NPOSIXL[:xdigit:]',
418    '(?l)[[:^xdigit:]\x{2C2}]' => 'NPOSIXL[:xdigit:]',
419    '(?u)[[:xdigit:]]' => 'POSIXU[:xdigit:]',
420    '(?u)[[:^xdigit:]]' => 'NPOSIXU[:xdigit:]',
421    '(?a)[[:xdigit:]]' => 'POSIXA[:xdigit:]',
422    '(?a)[[:^xdigit:]]' => 'NPOSIXA[:xdigit:]',
423    '(?a)[[:^xdigit:]\x{2C2}]' => 'NPOSIXA[:xdigit:]',
424    '[[:xdigit:][:^xdigit:]]' => 'SANY',
425    '[^[:xdigit:][:^xdigit:]]' => 'OPFAIL',
426    '(?l)[[:xdigit:][:^xdigit:]]' => 'SANY',
427    '(?l)[^[:xdigit:][:^xdigit:]]' => 'OPFAIL',
428    '(?u)[[:xdigit:][:^xdigit:]]' => 'SANY',
429    '(?u)[^[:xdigit:][:^xdigit:]]' => 'OPFAIL',
430    '(?a)[[:xdigit:][:^xdigit:]]' => 'SANY',
431    '(?a)[^[:xdigit:][:^xdigit:]]' => 'OPFAIL',
432    '(?i)[[:lower:]]' => 'POSIXD[:cased:]',
433    '(?i)[[:^lower:]]' => 'NPOSIXD[:cased:]',
434    '(?i)[[:^lower:]\x{2C2}]' => 'NPOSIXU[:cased:]',
435    '(?i)(?l)[[:lower:]]' => 'POSIXL[:cased:]',
436    '(?i)(?l)[[:^lower:]]' => 'NPOSIXL[:cased:]',
437    '(?i)(?l)[[:^lower:]\x{2C2}]' => 'NPOSIXL[:cased:]',
438    '(?i)(?u)[[:lower:]]' => 'POSIXU[:cased:]',
439    '(?i)(?u)[[:^lower:]]' => 'NPOSIXU[:cased:]',
440    '(?i)(?a)[[:lower:]]' => 'POSIXA[:alpha:]',
441    '(?i)(?a)[[:^lower:]]' => 'NPOSIXA[:alpha:]',
442    '(?i)(?a)[[:^lower:]\x{2C2}]' => 'NPOSIXA[:alpha:]',
443    '(?i)[[:upper:]]' => 'POSIXD[:cased:]',
444    '(?i)[[:^upper:]]' => 'NPOSIXD[:cased:]',
445    '(?i)[[:^upper:]\x{2C2}]' => 'NPOSIXU[:cased:]',
446    '(?i)(?l)[[:upper:]]' => 'POSIXL[:cased:]',
447    '(?i)(?l)[[:^upper:]]' => 'NPOSIXL[:cased:]',
448    '(?i)(?l)[[:^upper:]\x{2C2}]' => 'NPOSIXL[:cased:]',
449    '(?i)(?u)[[:upper:]]' => 'POSIXU[:cased:]',
450    '(?i)(?u)[[:^upper:]]' => 'NPOSIXU[:cased:]',
451    '(?i)(?a)[[:upper:]]' => 'POSIXA[:alpha:]',
452    '(?i)(?a)[[:^upper:]]' => 'NPOSIXA[:alpha:]',
453    '(?i)(?a)[[:^upper:]\x{2C2}]' => 'NPOSIXA[:alpha:]',
454    '(?i)[\d\w]' => 'POSIXD[\w]',
455    '(?i)[\D\w]' => 'SANY',
456    #'(?i)(?l)[\d\w]' => varies depending on Unicode release
457    '(?i)(?l)[\D\w]' => 'ANYOFPOSIXL{i}[\\w\\D][0100-INFTY]',
458    '(?i)(?u)[\d\w]' => 'POSIXU[\w]',
459    '(?i)(?u)[\D\w]' => 'SANY',
460    '(?i)(?a)[\d\w]' => 'POSIXA[\w]',
461    '(?i)(?a)[\D\w]' => 'SANY',
462    '(?l:[\x{212A}])' => 'ANYOFL[212A]',
463    '(?l:[\s\x{212A}])' => 'ANYOFPOSIXL[\s][1680 2000-200A 2028-2029 202F 205F 212A 3000]',
464    '(?l:[^\S\x{202F}])' => 'ANYOFPOSIXL[^\\S][1680 2000-200A 2028-2029 205F 3000]',
465    '(?li:[a-z])' => 'ANYOFL{i}[a-z{utf8 locale}\x{017F}\x{212A}]',
466
467    '\p{All}' => 'SANY',
468    '\P{All}' => 'OPFAIL',
469    '[\p{Any}]' => 'ANYOF[\x00-\xFF][0100-10FFFF]',
470
471    '[\p{IsMyRuntimeProperty}]' => 'ANYOF[+main::IsMyRuntimeProperty]',
472    '[^\p{IsMyRuntimeProperty}]' => 'ANYOF[^{+main::IsMyRuntimeProperty}]',
473    '[a\p{IsMyRuntimeProperty}]' => 'ANYOF[a][+main::IsMyRuntimeProperty]',
474    '[^a\p{IsMyRuntimeProperty}]' => 'ANYOF[^a{+main::IsMyRuntimeProperty}]',
475    '[^a\x{100}\p{IsMyRuntimeProperty}]' => 'ANYOF[^a{+main::IsMyRuntimeProperty}0100]',
476    '[^\p{All}\p{IsMyRuntimeProperty}]' => 'OPFAIL',
477    '[\p{All}\p{IsMyRuntimeProperty}]' => 'SANY',
478
479    '[\x{00}-{INFTY_minus_1}]' => 'ANYOF[\x00-\xFF][0100-INFTY_minus_1]',
480    '[\x{00}-{INFTY}]' => 'SANY',
481    '(?i)[\x{100}]' => 'ANYOFH[0100-0101]',
482    '[\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
483    '[\x{101}-{INFTY_minus_1}]' => 'ANYOFH[0101-INFTY_minus_1]',
484    '[\x{102}\x{104}]' => 'ANYOFH[0102 0104]',
485    '[\x{102}-\x{104}{INFTY}]' => 'ANYOFH[0102-0104 INFTY-INFTY]',
486    '[\x{102}-\x{104}{INFTY_minus_1}]' => 'ANYOFH[0102-0104 INFTY_minus_1]',
487    '[\x{102}-\x{104}\x{101}]' => 'ANYOFH[0101-0104]',
488    '[\x{102}-\x{104}\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
489    '[\x{102}-\x{104}\x{101}-{INFTY_minus_1}]' => 'ANYOFH[0101-INFTY_minus_1]',
490    '[\x{102}-\x{104}\x{102}]' => 'ANYOFH[0102-0104]',
491    '[\x{102}-\x{104}\x{102}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
492    '[\x{102}-\x{104}\x{102}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY_minus_1]',
493    '[\x{102}-\x{104}\x{103}]' => 'ANYOFH[0102-0104]',
494    '[\x{102}-\x{104}\x{103}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
495    '[\x{102}-\x{104}\x{103}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY_minus_1]',
496    '[\x{102}-\x{104}\x{104}]' => 'ANYOFH[0102-0104]',
497    '[\x{102}-\x{104}\x{104}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
498    '[\x{102}-\x{104}\x{104}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY_minus_1]',
499    '[\x{102}-\x{104}\x{105}]' => 'ANYOFH[0102-0105]',
500    '[\x{102}-\x{104}\x{105}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
501    '[\x{102}-\x{104}\x{105}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY_minus_1]',
502    '[\x{102}-\x{104}\x{106}]' => 'ANYOFH[0102-0104 0106]',
503    '[\x{102}-\x{104}\x{106}-{INFTY}]' => 'ANYOFH[0102-0104 0106-INFTY]',
504    '[\x{102}-\x{104}\x{106}-{INFTY_minus_1}]' => 'ANYOFH[0102-0104 0106-INFTY_minus_1]',
505    '[\x{102}-\x{104}\x{108}-\x{10A}{INFTY}]' => 'ANYOFH[0102-0104 0108-010A INFTY-INFTY]',
506    '[\x{102}-\x{104}\x{108}-\x{10A}{INFTY_minus_1}]' => 'ANYOFH[0102-0104 0108-010A INFTY_minus_1]',
507    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}]' => 'ANYOFH[0101-0104 0108-010A]',
508    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
509    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{INFTY_minus_1}]' => 'ANYOFH[0101-INFTY_minus_1]',
510    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{102}]' => 'ANYOFH[0101-0104 0108-010A]',
511    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{103}]' => 'ANYOFH[0101-0104 0108-010A]',
512    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{104}]' => 'ANYOFH[0101-0104 0108-010A]',
513    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{105}]' => 'ANYOFH[0101-0105 0108-010A]',
514    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{106}]' => 'ANYOFH[0101-0106 0108-010A]',
515    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{107}]' => 'ANYOFH[0101-010A]',
516    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{108}]' => 'ANYOFH[0101-010A]',
517    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{109}]' => 'ANYOFH[0101-010A]',
518    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10A}]' => 'ANYOFH[0101-010A]',
519    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10B}]' => 'ANYOFH[0101-010B]',
520    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}]' => 'ANYOFH[0102-0104 0108-010A]',
521    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
522    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY_minus_1]',
523    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{102}]' => 'ANYOFH[0102-0104 0108-010A]',
524    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{103}]' => 'ANYOFH[0102-0104 0108-010A]',
525    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{104}]' => 'ANYOFH[0102-0104 0108-010A]',
526    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{105}]' => 'ANYOFH[0102-0105 0108-010A]',
527    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{106}]' => 'ANYOFH[0102-0106 0108-010A]',
528    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{107}]' => 'ANYOFH[0102-010A]',
529    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{108}]' => 'ANYOFH[0102-010A]',
530    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{109}]' => 'ANYOFH[0102-010A]',
531    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10A}]' => 'ANYOFH[0102-010A]',
532    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10B}]' => 'ANYOFH[0102-010B]',
533    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10C}]' => 'ANYOFH[0102-010C]',
534    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}]' => 'ANYOFH[0102-0104 0108-010A]',
535    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
536    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY_minus_1]',
537    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{104}]' => 'ANYOFH[0102-0104 0108-010A]',
538    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{105}]' => 'ANYOFH[0102-0105 0108-010A]',
539    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{106}]' => 'ANYOFH[0102-0106 0108-010A]',
540    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{107}]' => 'ANYOFH[0102-010A]',
541    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{108}]' => 'ANYOFH[0102-010A]',
542    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{109}]' => 'ANYOFH[0102-010A]',
543    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10A}]' => 'ANYOFH[0102-010A]',
544    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10B}]' => 'ANYOFH[0102-010B]',
545    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10C}]' => 'ANYOFH[0102-010C]',
546    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}]' => 'ANYOFH[0102-0104 0108-010A]',
547    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
548    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY_minus_1]',
549    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{105}]' => 'ANYOFH[0102-0105 0108-010A]',
550    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{106}]' => 'ANYOFH[0102-0106 0108-010A]',
551    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{107}]' => 'ANYOFH[0102-010A]',
552    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{108}]' => 'ANYOFH[0102-010A]',
553    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{109}]' => 'ANYOFH[0102-010A]',
554    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10A}]' => 'ANYOFH[0102-010A]',
555    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10B}]' => 'ANYOFH[0102-010B]',
556    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10C}]' => 'ANYOFH[0102-010C]',
557    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}]' => 'ANYOFH[0102-0105 0108-010A]',
558    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
559    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY_minus_1]',
560    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{106}]' => 'ANYOFH[0102-0106 0108-010A]',
561    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{107}]' => 'ANYOFH[0102-010A]',
562    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{108}]' => 'ANYOFH[0102-010A]',
563    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{109}]' => 'ANYOFH[0102-010A]',
564    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10A}]' => 'ANYOFH[0102-010A]',
565    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10B}]' => 'ANYOFH[0102-010B]',
566    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10C}]' => 'ANYOFH[0102-010C]',
567    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}]' => 'ANYOFH[0102-0104 0106 0108-010A]',
568    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{INFTY}]' => 'ANYOFH[0102-0104 0106-INFTY]',
569    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{INFTY_minus_1}]' => 'ANYOFH[0102-0104 0106-INFTY_minus_1]',
570    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{107}]' => 'ANYOFH[0102-0104 0106-010A]',
571    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{108}]' => 'ANYOFH[0102-0104 0106-010A]',
572    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{109}]' => 'ANYOFH[0102-0104 0106-010A]',
573    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10A}]' => 'ANYOFH[0102-0104 0106-010A]',
574    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10B}]' => 'ANYOFH[0102-0104 0106-010B]',
575    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10C}]' => 'ANYOFH[0102-0104 0106-010C]',
576    '[\x{102}-\x{104}\x{108}-\x{10A}\x{107}]' => 'ANYOFH[0102-0104 0107-010A]',
577    '[\x{102}-\x{104}\x{108}-\x{10A}\x{108}]' => 'ANYOFH[0102-0104 0108-010A]',
578    '[\x{102}-\x{104}\x{108}-\x{10A}\x{109}]' => 'ANYOFH[0102-0104 0108-010A]',
579    '[\x{102}-\x{104}\x{108}-\x{10A}\x{10A}]' => 'ANYOFH[0102-0104 0108-010A]',
580    '[\x{102}-\x{104}\x{108}-\x{10A}\x{10B}]' => 'ANYOFH[0102-0104 0108-010B]',
581    '[\x{103}\x{102}]' => 'ANYOFH[0102-0103]',
582    '[\x{104}\x{102}]' => 'ANYOFH[0102 0104]',
583    '[\x{104}\x{102}\x{103}]' => 'ANYOFH[0102-0104]',
584    '[\x{106}-{INFTY}\x{104}]' => 'ANYOFH[0104 0106-INFTY]',
585    '[\x{106}-{INFTY}\x{104}-{INFTY}]' => 'ANYOFH[0104-INFTY]',
586    '[\x{106}-{INFTY}\x{104}-{INFTY_minus_1}]' => 'ANYOFH[0104-INFTY]',
587    '[\x{106}-{INFTY}\x{104}-\x{105}]' => 'ANYOFH[0104-INFTY]',
588    '[\x{106}-{INFTY}\x{104}-\x{106}]' => 'ANYOFH[0104-INFTY]',
589    '[\x{106}-{INFTY}\x{104}-\x{107}]' => 'ANYOFH[0104-INFTY]',
590    '[\x{106}-{INFTY}\x{105}]' => 'ANYOFH[0105-INFTY]',
591    '[\x{106}-{INFTY}\x{105}-{INFTY}]' => 'ANYOFH[0105-INFTY]',
592    '[\x{106}-{INFTY}\x{105}-{INFTY_minus_1}]' => 'ANYOFH[0105-INFTY]',
593    '[\x{106}-{INFTY}\x{105}-\x{106}]' => 'ANYOFH[0105-INFTY]',
594    '[\x{106}-{INFTY}\x{105}-\x{107}]' => 'ANYOFH[0105-INFTY]',
595    '[\x{106}-{INFTY}\x{106}]' => 'ANYOFH[0106-INFTY]',
596    '[\x{106}-{INFTY}\x{106}-{INFTY}]' => 'ANYOFH[0106-INFTY]',
597    '[\x{106}-{INFTY}\x{106}-{INFTY_minus_1}]' => 'ANYOFH[0106-INFTY]',
598    '[\x{106}-{INFTY}\x{106}-\x{107}]' => 'ANYOFH[0106-INFTY]',
599    '[\x{106}-{INFTY}\x{107}]' => 'ANYOFH[0106-INFTY]',
600    '[\x{106}-{INFTY}\x{107}-{INFTY}]' => 'ANYOFH[0106-INFTY]',
601    '[\x{106}-{INFTY}\x{107}-{INFTY_minus_1}]' => 'ANYOFH[0106-INFTY]',
602    '[\x{106}-{INFTY}\x{107}-\x{107}]' => 'ANYOFH[0106-INFTY]',
603    '[\x{10C}-{INFTY}{INFTY}]' => 'ANYOFH[010C-INFTY]',
604    '[\x{10C}-{INFTY}{INFTY_minus_1}]' => 'ANYOFH[010C-INFTY]',
605    '[\x{10C}-{INFTY}\x{00}-{INFTY_minus_1}]' => 'SANY',
606    '[\x{10C}-{INFTY}\x{00}-{INFTY}]' => 'SANY',
607    '[\x{10C}-{INFTY}\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
608    '[\x{10C}-{INFTY}\x{101}-{INFTY_minus_1}]' => 'ANYOFH[0101-INFTY]',
609    '[\x{10C}-{INFTY}\x{102}\x{104}]' => 'ANYOFH[0102 0104 010C-INFTY]',
610    '[\x{10C}-{INFTY}\x{102}-\x{104}{INFTY}]' => 'ANYOFH[0102-0104 010C-INFTY]',
611    '[\x{10C}-{INFTY}\x{102}-\x{104}{INFTY_minus_1}]' => 'ANYOFH[0102-0104 010C-INFTY]',
612    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{100}]' => 'ANYOFH[0100 0102-0104 010C-INFTY]',
613    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{101}]' => 'ANYOFH[0101-0104 010C-INFTY]',
614    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
615    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{101}-{INFTY_minus_1}]' => 'ANYOFH[0101-INFTY]',
616    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{102}]' => 'ANYOFH[0102-0104 010C-INFTY]',
617    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{102}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
618    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{102}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY]',
619    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{103}]' => 'ANYOFH[0102-0104 010C-INFTY]',
620    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{103}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
621    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{103}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY]',
622    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{104}]' => 'ANYOFH[0102-0104 010C-INFTY]',
623    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{104}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
624    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{104}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY]',
625    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{105}]' => 'ANYOFH[0102-0105 010C-INFTY]',
626    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{105}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
627    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{105}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY]',
628    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{106}]' => 'ANYOFH[0102-0104 0106 010C-INFTY]',
629    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{106}-{INFTY}]' => 'ANYOFH[0102-0104 0106-INFTY]',
630    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{106}-{INFTY_minus_1}]' => 'ANYOFH[0102-0104 0106-INFTY]',
631    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}{INFTY}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
632    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}{INFTY_minus_1}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
633    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}]' => 'ANYOFH[0101-0104 0108-010A 010C-INFTY]',
634    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
635    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{INFTY_minus_1}]' => 'ANYOFH[0101-INFTY]',
636    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{102}]' => 'ANYOFH[0101-0104 0108-010A 010C-INFTY]',
637    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{103}]' => 'ANYOFH[0101-0104 0108-010A 010C-INFTY]',
638    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{104}]' => 'ANYOFH[0101-0104 0108-010A 010C-INFTY]',
639    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{105}]' => 'ANYOFH[0101-0105 0108-010A 010C-INFTY]',
640    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{106}]' => 'ANYOFH[0101-0106 0108-010A 010C-INFTY]',
641    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{107}]' => 'ANYOFH[0101-010A 010C-INFTY]',
642    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{108}]' => 'ANYOFH[0101-010A 010C-INFTY]',
643    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{109}]' => 'ANYOFH[0101-010A 010C-INFTY]',
644    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10A}]' => 'ANYOFH[0101-010A 010C-INFTY]',
645    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10B}]' => 'ANYOFH[0101-INFTY]',
646    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
647    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
648    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY]',
649    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{102}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
650    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{103}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
651    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{104}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
652    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{105}]' => 'ANYOFH[0102-0105 0108-010A 010C-INFTY]',
653    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{106}]' => 'ANYOFH[0102-0106 0108-010A 010C-INFTY]',
654    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{107}]' => 'ANYOFH[0102-010A 010C-INFTY]',
655    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{108}]' => 'ANYOFH[0102-010A 010C-INFTY]',
656    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{109}]' => 'ANYOFH[0102-010A 010C-INFTY]',
657    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10A}]' => 'ANYOFH[0102-010A 010C-INFTY]',
658    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10B}]' => 'ANYOFH[0102-INFTY]',
659    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10C}]' => 'ANYOFH[0102-INFTY]',
660    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
661    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
662    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY]',
663    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{104}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
664    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{105}]' => 'ANYOFH[0102-0105 0108-010A 010C-INFTY]',
665    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{106}]' => 'ANYOFH[0102-0106 0108-010A 010C-INFTY]',
666    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{107}]' => 'ANYOFH[0102-010A 010C-INFTY]',
667    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{108}]' => 'ANYOFH[0102-010A 010C-INFTY]',
668    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{109}]' => 'ANYOFH[0102-010A 010C-INFTY]',
669    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10A}]' => 'ANYOFH[0102-010A 010C-INFTY]',
670    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10B}]' => 'ANYOFH[0102-INFTY]',
671    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10C}]' => 'ANYOFH[0102-INFTY]',
672    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
673    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
674    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY]',
675    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{105}]' => 'ANYOFH[0102-0105 0108-010A 010C-INFTY]',
676    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{106}]' => 'ANYOFH[0102-0106 0108-010A 010C-INFTY]',
677    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{107}]' => 'ANYOFH[0102-010A 010C-INFTY]',
678    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{108}]' => 'ANYOFH[0102-010A 010C-INFTY]',
679    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{109}]' => 'ANYOFH[0102-010A 010C-INFTY]',
680    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10A}]' => 'ANYOFH[0102-010A 010C-INFTY]',
681    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10B}]' => 'ANYOFH[0102-INFTY]',
682    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10C}]' => 'ANYOFH[0102-INFTY]',
683    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}]' => 'ANYOFH[0102-0105 0108-010A 010C-INFTY]',
684    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
685    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{INFTY_minus_1}]' => 'ANYOFH[0102-INFTY]',
686    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{106}]' => 'ANYOFH[0102-0106 0108-010A 010C-INFTY]',
687    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{107}]' => 'ANYOFH[0102-010A 010C-INFTY]',
688    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{108}]' => 'ANYOFH[0102-010A 010C-INFTY]',
689    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{109}]' => 'ANYOFH[0102-010A 010C-INFTY]',
690    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10A}]' => 'ANYOFH[0102-010A 010C-INFTY]',
691    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10B}]' => 'ANYOFH[0102-INFTY]',
692    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10C}]' => 'ANYOFH[0102-INFTY]',
693    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}]' => 'ANYOFH[0102-0104 0106 0108-010A 010C-INFTY]',
694    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{INFTY}]' => 'ANYOFH[0102-0104 0106-INFTY]',
695    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{INFTY_minus_1}]' => 'ANYOFH[0102-0104 0106-INFTY]',
696    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{107}]' => 'ANYOFH[0102-0104 0106-010A 010C-INFTY]',
697    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{108}]' => 'ANYOFH[0102-0104 0106-010A 010C-INFTY]',
698    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{109}]' => 'ANYOFH[0102-0104 0106-010A 010C-INFTY]',
699    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10A}]' => 'ANYOFH[0102-0104 0106-010A 010C-INFTY]',
700    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10B}]' => 'ANYOFH[0102-0104 0106-INFTY]',
701    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10C}]' => 'ANYOFH[0102-0104 0106-INFTY]',
702    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{107}]' => 'ANYOFH[0102-0104 0107-010A 010C-INFTY]',
703    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{108}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
704    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{109}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
705    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{10A}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
706    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{10B}]' => 'ANYOFH[0102-0104 0108-INFTY]',
707    '[\x{10C}-{INFTY}\x{103}\x{102}]' => 'ANYOFH[0102-0103 010C-INFTY]',
708    '[\x{10C}-{INFTY}\x{104}\x{102}]' => 'ANYOFH[0102 0104 010C-INFTY]',
709    '[\x{10C}-{INFTY}\x{104}\x{102}\x{103}]' => 'ANYOFH[0102-0104 010C-INFTY]',
710    '[{INFTY_minus_1}]' => 'ANYOFH[INFTY_minus_1]',
711    '[{INFTY}]' => 'ANYOFH[INFTY-INFTY]',
712
713    '(?8)(?i)[\x{100}]' => 'EXACTFU_ONLY8 <\x{101}>',
714    '(?8)(?i)[\x{399}]' => 'EXACTFU_ONLY8 <\x{3b9}>',
715    '(?8)(?i)[\x{345}\x{399}\x{3B9}\x{1FBE}]' => 'EXACTFU_ONLY8 <\x{3b9}>',
716    '(?i)[\x{2b9}]' => 'ANYOFH[02B9]',           # Doesn't participate in a fold
717    '(?8)(?i)[\x{2b9}]' => 'EXACT_ONLY8 <\x{2b9}>',
718    '(?i)[\x{2bc}]' => 'EXACTFU_ONLY8 <\x{2bc}>', # Part of a multi-char fold, ASCII component
719    '(?i)[\x{390}]' => 'EXACTFU_ONLY8 <\x{3b9}\x{308}\x{301}>', # Part of a multi-char fold, no ASCII component
720
721    '(?i)[\x{1E9E}]' => 'EXACTFU <ss>',
722    '(?iaa)[\x{1E9E}]' => 'EXACTFAA <\x{17f}\x{17f}>',
723    '(?i)[\x{FB00}]' => 'EXACTFU <ff>',
724    '(?iaa)[\x{FB00}]' => 'ANYOFH[FB00]',
725    '(?i)[\x{FB00}]' => 'EXACTFU <ff>',
726    '(?i)[\x{FB01}]' => 'EXACTFU <fi>',
727    '(?i)[\x{FB02}]' => 'EXACTFU <fl>',
728    '(?i)[\x{FB03}]' => 'EXACTFU <ffi>',
729    '(?i)[\x{FB04}]' => 'EXACTFU <ffl>',
730    '(?i)[\x{FB05}]' => 'EXACTFU <st>',
731    '(?i)[\x{FB06}]' => 'EXACTFU <st>',
732
733    '[a][b]' => 'EXACT <ab>',
734    '[a]\x{100}' => 'EXACT_ONLY8 <a\x{100}>',
735    '(?8)[\x{100}]a' => 'EXACT_ONLY8 <\x{100}a>',
736    '(?i)[b][c]' => 'EXACTFU <bc>',
737    '(?i)[b]\x{100}' => 'EXACTFU_ONLY8 <b\x{101}>',
738    '(?8)(?i)[\x{100}]b' => 'EXACTFU_ONLY8 <\x{101}b>',
739    '(?i)b[s]' => 'EXACTFU <bs>',
740    '(?i)b[s]c' => 'EXACTFU <bsc>',
741    '(?i)bs[s]c' => 'EXACTF <bss>',  # The c goes into a 2nd node
742    '(?iu)bs[s]c' => 'EXACTFUP <bssc>',
743    '(?i)b[s]sc' => 'EXACTF <bssc>',
744    '(?iu)b[s]sc' => 'EXACTFUP <bssc>',
745    '(?i)[b]st' => 'EXACTFU <bst>',
746    '(?i)[b]st[s]' => 'EXACTFU <bsts>',
747    '(?i)[b]st[s]st' => 'EXACTF <bstsst>',
748    '(?iu)[b]st[s]st' => 'EXACTFUP <bstsst>',
749    '(?i)[s][s]' => 'EXACTF <ss>',
750    '(?iu)[s][s]' => 'EXACTFUP <ss>',
751);
752
753my @single_chars_to_test =
754(
755    "\x00",     # Always potentially problematic
756    "\x01",     # Unnamed control
757    "\b",       # Named control
758    "\n",       # Potentially special
759    "\r",       # Potentially special
760    "\cK",      # Potentially special
761    "0",        # Digit
762    ":",        # Not in any fold
763    "A",        # ASCII capital, participates in multi-char fold
764    "a",        # ASCII small, participates in multi-char fold
765    "B",        # ASCII capital, participates only in case-pair fold
766    "b",        # ASCII small, participates only in case-pair fold
767    "K",        # ASCII capital, folded to from above Latin1
768    "k",        # ASCII small, folded to from above Latin1
769    "\c?",      # Potentially special
770    "\x80",     # Latin1 control
771    "\xB5",     # Micro sign, folds to above Latin1
772    "\xC0",     # Latin1 capital, participates only in case-pair fold
773    "\xE0",     # Latin1 small, participates only in case-pair fold
774    "\xC5",     # Latin1 capital, folded to from above Latin1
775    "\xE5",     # Latin1 small, folded to from above Latin1
776    "\xDF",     # Small sharp S. folds to 'ss'
777    "\xF7",     # Doesn't participate in any fold
778    "\xFF",     # Folded to by above Latin1
779    "\x{100}",  # First few above Latin1 characters
780    "\x{101}",
781    "\x{102}",
782    "\x{103}",
783    "\x{104}",
784    "\x{105}",
785    "\x{106}",
786    "\x{107}",
787    "\x{108}",
788);
789
790my @single_tests;
791for my $char (@single_chars_to_test) {
792    my $cp = ord $char;
793    my $hex = sprintf "%02x", $cp;
794    my $oct = sprintf "%o", $cp;
795    my $cp_string;
796
797    my $cased;
798    my $folded_hex;
799
800    {
801        use feature 'unicode_strings';
802        $cased = uc $char ne $char || lc $char ne $char;
803        $folded_hex = ($cased)
804                      ? sprintf("%02x", ord lc $char)
805                      : $hex;
806        #print STDERR "$hex, $folded_hex\n";
807    }
808
809    for my $fold ("", "i") {
810        #next unless $fold;
811        for my $charset ("", "u", "l", "aa") {
812            #next if $charset eq "aa" && ! $fold;
813
814            my $modifiers = $fold . $charset;
815            $modifiers = "(?$modifiers)" if $modifiers;
816
817            for my $upgrade ("", "(?8)") {
818                push @single_tests, "$upgrade$modifiers\[\\x{$hex}\]";
819                if ($cp < 256 || $upgrade) {
820                    push @single_tests, get_compiled("$upgrade$modifiers\\x{$hex}");
821                }
822                else {
823                    my $interior = "";
824                    my @list = $cp;
825                    if ($fold) {
826                        if (lc $char ne $char) {
827                            push @list, ord lc $char;
828                        }
829                        elsif (uc $char ne $char) {
830                            push @list, ord uc $char;
831                        }
832                    }
833                    @list = sort { $a <=> $b } @list;
834                    if (@list == 1) {
835                        $interior = sprintf "%04X", $list[0];
836                    }
837                    elsif (@list == 2) {
838                        my $separator = ($list[1] == $list[0] + 1) ? '-' : ', ';
839                        $interior = sprintf "%04X$separator%04X", $list[0], $list[1];
840                    }
841                    else {
842                        die join ", ", @list;
843                    }
844                    my $anyof = ($charset eq "l") ? "ANYOFL" : "ANYOFH";
845                    push @single_tests, "$anyof\[$interior\]";
846                }
847            }
848        }
849    }
850}
851
852unshift @tests, @single_tests;
853
854plan(scalar (@tests - 1) / 2);  # -1 because of the marker.
855
856my $skip_ebcdic = $::IS_EBCDIC;
857while (defined (my $test = shift @tests)) {
858
859    if ($test eq 'ebcdic_ok_below_this_marker') {
860        $skip_ebcdic = 0;
861        next;
862    }
863
864    my $expected = shift @tests;
865
866    SKIP: {
867        skip("test not ported to EBCDIC", 1) if $skip_ebcdic;
868
869        my $display_expected = $expected
870                                  =~ s/ INFTY_minus_1 /$next_highest_cp/xgr;
871        my $test_name = "Verify compilation of $test displays as"
872                      . " $display_expected";
873
874        my $result = get_compiled($test);
875        if ($expected =~ / ^ ANYOFH /x) {
876            like($result, qr/ ^ \Q$expected\E (?:\Q (First UTF-8 byte=\x\E
877                              [[:xdigit:]]{2}\) )? $ /x, $test_name);
878        }
879        else {
880            is($result, $expected,
881               "Verify compilation of $test displays as $test_name");
882        }
883    }
884}
885