...
Text file
src/regexp/syntax/make_perl_groups.pl
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
14use strict;
15use warnings;
16
17my @posixclasses = (
18 "[:alnum:]",
19 "[:alpha:]",
20 "[:ascii:]",
21 "[:blank:]",
22 "[:cntrl:]",
23 "[:digit:]",
24 "[:graph:]",
25 "[:lower:]",
26 "[:print:]",
27 "[:punct:]",
28 "[:space:]",
29 "[:upper:]",
30 "[:word:]",
31 "[:xdigit:]",
32);
33
34my @perlclasses = (
35 "\\d",
36 "\\s",
37 "\\w",
38);
39
40my %overrides = (
41 # Prior to Perl 5.18, \s did not match vertical tab.
42 # RE2 preserves that original behaviour.
43 "\\s:11" => 0,
44);
45
46sub ComputeClass($) {
47 my @ranges;
48 my ($class) = @_;
49 my $regexp = "[$class]";
50 my $start = -1;
51 for (my $i=0; $i<=129; $i++) {
52 if ($i == 129) { $i = 256; }
53 if ($i <= 128 && ($overrides{"$class:$i"} // chr($i) =~ $regexp)) {
54 if ($start < 0) {
55 $start = $i;
56 }
57 } else {
58 if ($start >= 0) {
59 push @ranges, [$start, $i-1];
60 }
61 $start = -1;
62 }
63 }
64 return @ranges;
65}
66
67sub PrintClass($$@) {
68 my ($cname, $name, @ranges) = @_;
69 print "var code$cname = []rune{ /* $name */\n";
70 for (my $i=0; $i<@ranges; $i++) {
71 my @a = @{$ranges[$i]};
72 printf "\t0x%x, 0x%x,\n", $a[0], $a[1];
73 }
74 print "}\n\n";
75 my $n = @ranges;
76 my $negname = $name;
77 if ($negname =~ /:/) {
78 $negname =~ s/:/:^/;
79 } else {
80 $negname =~ y/a-z/A-Z/;
81 }
82 return "\t`$name`: {+1, code$cname},\n" .
83 "\t`$negname`: {-1, code$cname},\n";
84}
85
86my $gen = 0;
87
88sub PrintClasses($@) {
89 my ($cname, @classes) = @_;
90 my @entries;
91 foreach my $cl (@classes) {
92 my @ranges = ComputeClass($cl);
93 push @entries, PrintClass(++$gen, $cl, @ranges);
94 }
95 print "var ${cname}Group = map[string]charGroup{\n";
96 foreach my $e (@entries) {
97 print $e;
98 }
99 print "}\n";
100 my $count = @entries;
101}
102
103# Prepare gofmt command
104my $gofmt;
105
106if (@ARGV > 0 && $ARGV[0] =~ /\.go$/) {
107 # Send the output of gofmt to the given file
108 open($gofmt, '|-', 'gofmt >'.$ARGV[0]) or die;
109} else {
110 open($gofmt, '|-', 'gofmt') or die;
111}
112
113# Redirect STDOUT to gofmt input
114select $gofmt;
115
116print <<EOF;
117// Copyright 2013 The Go Authors. All rights reserved.
118// Use of this source code is governed by a BSD-style
119// license that can be found in the LICENSE file.
120
121// Code generated by make_perl_groups.pl; DO NOT EDIT.
122
123package syntax
124
125EOF
126
127PrintClasses("perl", @perlclasses);
128PrintClasses("posix", @posixclasses);
View as plain text