1 #!/usr/bin/perl 2 # Copyright 2008 The Go Authors. All rights reserved. 3 # Use of this source code is governed by a BSD-style 4 # license that can be found in the LICENSE file. 5 6 # Modified version of RE2's make_perl_groups.pl. 7 8 # Generate table entries giving character ranges 9 # for POSIX/Perl character classes. Rather than 10 # figure out what the definition is, it is easier to ask 11 # Perl about each letter from 0-128 and write down 12 # its answer. 13 14 @posixclasses = ( 15 "[:alnum:]", 16 "[:alpha:]", 17 "[:ascii:]", 18 "[:blank:]", 19 "[:cntrl:]", 20 "[:digit:]", 21 "[:graph:]", 22 "[:lower:]", 23 "[:print:]", 24 "[:punct:]", 25 "[:space:]", 26 "[:upper:]", 27 "[:word:]", 28 "[:xdigit:]", 29 ); 30 31 @perlclasses = ( 32 "\\d", 33 "\\s", 34 "\\w", 35 ); 36 37 sub ComputeClass($) { 38 my @ranges; 39 my ($class) = @_; 40 my $regexp = "[$class]"; 41 my $start = -1; 42 for (my $i=0; $i<=129; $i++) { 43 if ($i == 129) { $i = 256; } 44 if ($i <= 128 && chr($i) =~ $regexp) { 45 if ($start < 0) { 46 $start = $i; 47 } 48 } else { 49 if ($start >= 0) { 50 push @ranges, [$start, $i-1]; 51 } 52 $start = -1; 53 } 54 } 55 return @ranges; 56 } 57 58 sub PrintClass($$@) { 59 my ($cname, $name, @ranges) = @_; 60 print "var code$cname = []rune{ /* $name */\n"; 61 for (my $i=0; $i<@ranges; $i++) { 62 my @a = @{$ranges[$i]}; 63 printf "\t0x%x, 0x%x,\n", $a[0], $a[1]; 64 } 65 print "}\n\n"; 66 my $n = @ranges; 67 $negname = $name; 68 if ($negname =~ /:/) { 69 $negname =~ s/:/:^/; 70 } else { 71 $negname =~ y/a-z/A-Z/; 72 } 73 return "\t`$name`: {+1, code$cname},\n" . 74 "\t`$negname`: {-1, code$cname},\n"; 75 } 76 77 my $gen = 0; 78 79 sub PrintClasses($@) { 80 my ($cname, @classes) = @_; 81 my @entries; 82 foreach my $cl (@classes) { 83 my @ranges = ComputeClass($cl); 84 push @entries, PrintClass(++$gen, $cl, @ranges); 85 } 86 print "var ${cname}Group = map[string]charGroup{\n"; 87 foreach my $e (@entries) { 88 print $e; 89 } 90 print "}\n"; 91 my $count = @entries; 92 } 93 94 print <<EOF; 95 // Copyright 2013 The Go Authors. All rights reserved. 96 // Use of this source code is governed by a BSD-style 97 // license that can be found in the LICENSE file. 98 99 // GENERATED BY make_perl_groups.pl; DO NOT EDIT. 100 // make_perl_groups.pl >perl_groups.go 101 102 package syntax 103 104 EOF 105 106 PrintClasses("perl", @perlclasses); 107 PrintClasses("posix", @posixclasses); 108