source: proto/charsetcompiler/unicode_category_compiler.py @ 5143

Last change on this file since 5143 was 4370, checked in by cameron, 5 years ago

Factor out if-hierarchy support

File size: 4.3 KB
Line 
1#
2# Prototype for computing utf8 character classes
3# Assuming byte-class/byte-range compilers exist.
4#
5# Robert D. Cameron, June 2, 2013
6#
7# Licensed under Open Software License 3.0.
8
9from utf8_lib import *
10from pablo_expr import *
11from CC_compiler import *
12from UTF_encoding import *
13from charset_def import *
14from UCD.general_category import *
15from if_hierarchy import *
16import optparse, sys
17
18
19
20Unicode_CC_struct = "class struct_%s:\n\tcc = 0\n\n"
21Unicode_CC_header = "def %s(basis_bits, struct_%s):\n"
22Unicode_dummy_main = "\n\ndef Main(basis_bits):\n    pass\n"
23
24
25grep_struct = r"""
26class Basis_bits():
27  bit_0 = 0
28  bit_1 = 0
29  bit_2 = 0
30  bit_3 = 0
31  bit_4 = 0
32  bit_5 = 0
33  bit_6 = 0
34  bit_7 = 0 
35 
36class Lex():
37  LF = (0)
38 
39class Output():
40        matches = 0
41
42def ParseLines(basis_bits, lex):
43  temp1 = (basis_bits.bit_0 | basis_bits.bit_1)
44  temp2 = (basis_bits.bit_2 | basis_bits.bit_3)
45  temp3 = (temp1 | temp2)
46  temp4 = (basis_bits.bit_4 &~ basis_bits.bit_5)
47  temp5 = (basis_bits.bit_6 &~ basis_bits.bit_7)
48  temp6 = (temp4 & temp5)
49  lex.LF = (temp6 &~ temp3)
50
51"""
52
53
54
55
56
57
58def generateDefs1(general_category):
59  catmap = {}
60  catmap[general_category] = UnicodeCategoryMap[general_category]
61  struct = Unicode_CC_struct % (general_category)
62  header = "def %s(basis_bits, struct_%s):\n" % (general_category, general_category)
63  if options.grep:
64        struct = grep_struct
65        header = "def Demo(basis_bits, lex, output):\n"
66        template_var = "all_%s"
67  else:
68        struct = Unicode_CC_struct % (general_category)
69        header = "def %s(basis_bits, struct_%s):\n" % (general_category, general_category)
70        template_var = "struct_%s.cc"
71  if options.flat:
72      code = generateCharClassDefs([], catmap, template_var)
73  elif options.simple:
74      code = generateCharClassDefs([(0x80, 0x7FF), (0x800,0xFFFF), (0x10000, 0x10FFF)], catmap, template_var)
75  else:
76      code = generateCharClassDefs(defaultIfRangeList, catmap,  template_var)
77  if options.grep:
78      code += r"""
79        output.matches = 0
80        all_matches = pablo.Advance(all_chars & ~lex.LF)
81        if all_matches:
82                # Find the last match on each line and filter out all others
83                output.matches = pablo.MatchStar(all_matches, ~lex.LF) & lex.LF
84"""
85  return struct + header + "".join(code)
86
87def generate_main():
88  if options.grep:
89        main = "\n\ndef Main(basis_bits, lex, output):\n    ParseLines(basis_bits, lex)\n    Demo(basis_bits, lex, output)\n"
90  else:
91        main = Unicode_dummy_main
92  return main
93
94
95def main():   
96
97    global options, UnicodeCategoryMap
98    # Option definition
99    option_parser = optparse.OptionParser(usage='python %prog [options] <output file>', version='0.1')
100 
101    option_parser.add_option('-c', '--category',
102                             dest='category',
103                             type='string',
104                             default='Cc',
105                             help='general category; default: Cc',
106                             )
107    option_parser.add_option('-g', '--grep',
108                             dest='grep',
109                             action='store_true',
110                             default=False,
111                             help='Use grep template',
112                             ) 
113    option_parser.add_option('-f', '--flat',
114                             dest='flat',
115                             action='store_true',
116                             default=False,
117                             help='Flatten the calculations into a single basic block',
118                             ) 
119    option_parser.add_option('-s', '--simple',
120                             dest='simple',
121                             action='store_true',
122                             default=False,
123                             help='Use a simple if-structure on UTF-8 length',
124                             ) 
125    options, args = option_parser.parse_args(sys.argv[1:])
126
127    (catlen, UnicodeCategoryMap) = parse_general()
128   
129    code = ""
130    if options.category == '.':
131        for k in UnicodeCategoryMap.keys():
132            code += generateDefs1(k)
133   
134    else:
135        if options.category not in UnicodeCategoryMap:
136            #define the characters in the list
137            print "Unknown general category %s" % options.category
138            exit
139        code = generateDefs1(options.category)
140
141
142    code += generate_main()
143
144    if (len(args) == 1):
145        fh = open(args[0], "w")
146        fh.write(code)
147        fh.close()
148    elif len(args) == 0:
149        print code
150    else:
151        option_parser.print_usage()
152       
153
154
155
156
157if __name__ == "__main__": main()
158
159
160
161
162
163
164
Note: See TracBrowser for help on using the repository browser.