source: proto/charsetcompiler/charset_compiler.py @ 3943

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

Refactor to create CC_compiler object

File size: 7.4 KB
Line 
1#
2#  Character Class Compiler
3#
4#  Version 0.9 - June 24, 2013
5#
6#  Copyright (c) 2007-13, Robert D. Cameron
7#  Licensed to the public under Open Software License 3.0
8#
9#  Initial UTF-16 and UTF-32 support added by Dale Denis, June 2013.
10#
11#  TO DO
12#    - add autosensing of 16/32 bit characters from input files
13#    - optimization of range logic for 16-bit char sets.
14#
15#--------------------------------------------------------------------------
16#
17#  Data types
18#  1. Character Set Definitions
19#  2. Boolean Expressions
20#  3. Code Generator Objects
21#
22import sys, optparse
23import re, binascii, string
24import EBCDIC
25
26
27import charset_def
28CharDef = charset_def.CharDef
29CharSetDef = charset_def.CharSetDef
30
31import charsets
32DefinitionSet = charsets.DefinitionSet
33
34import charset_input_parser
35
36import UTF_encoding
37Encoding_Type = UTF_encoding.UTF_Encoding_Type
38
39from bitwise_expr import *
40from CC_compiler import *
41
42
43def main():   
44
45    global options
46    # Option definition
47    option_parser = optparse.OptionParser(usage='python %prog [options] <input file>', version='0.8')
48 
49    option_parser.add_option('-u', '--character_encoding',
50                             dest='character_encoding',
51                             type='string',
52                             default='Default',
53                             help='character encoding; default: UTF-8',
54                             ) 
55    option_parser.add_option('-b', '--basis_pattern', 
56                             dest='basis_pattern',
57                             type='string',
58                             default='basis_bits.bit_%i',
59                             help='pattern for basis bit streams; default: basis_bits.bit_%i',
60                             )
61    option_parser.add_option('-l', '--little_endian',
62                             dest='little_endian',
63                             action='store_true',
64                             default=False,
65                             help='sets bit numbering of the output to little-endian',
66                             )
67    option_parser.add_option('-g', '--gensym_pattern', 
68                             dest='gensym_pattern',
69                             type='string',
70                             default='temp%i',
71                             help='pattern for generated temporaries; default: temp%i',
72                             )
73    option_parser.add_option('-E', '--EBCDIC', 
74                             dest='use_EBCDIC',
75                             action='store_true', 
76                             default=False,
77                             help='generate definitions for EBCDIC input',
78                             )
79    option_parser.add_option('-p', '--pablo', 
80                             dest='Pablo_skeleton',
81                             action='store_true', 
82                             default=False,
83                             help='generate pablo skeleton',
84                             )
85    option_parser.add_option('-t', '--test', 
86                             dest='test_skeleton',
87                             action='store_true', 
88                             default=False,
89                             help='generate pablo test skeleton',
90                             )
91    options, args = option_parser.parse_args(sys.argv[1:])
92
93    # Set the encoding.
94       
95    #If the user has entered the encoding type as a command-line argument
96    #then the encoding type that is to be used is locked.
97    if options.character_encoding == UTF_encoding.UTF32.name:
98        UTF_encoding.Encoding = Encoding_Type(options.character_encoding, 
99        UTF_encoding.UTF32.bits, UTF_encoding.UTF32.mask, False, True)
100    elif options.character_encoding == UTF_encoding.UTF16.name:
101        UTF_encoding.Encoding = Encoding_Type(options.character_encoding, 
102        UTF_encoding.UTF16.bits, UTF_encoding.UTF16.mask, False, True)
103    elif options.character_encoding == UTF_encoding.UTF8.name: 
104        UTF_encoding.Encoding = Encoding_Type(options.character_encoding,
105        UTF_encoding.UTF8.bits, UTF_encoding.UTF8.mask, False, True)
106    elif options.character_encoding == 'Default': 
107        UTF_encoding.Encoding = Encoding_Type(UTF_encoding.UTF8.name, 
108        UTF_encoding.UTF8.bits, UTF_encoding.UTF8.mask, True, False)
109    else:
110        print "ERROR: Invalid encoding format."
111        return
112
113    # If we have a valid encoding format then set the basis pattern.
114    UTF_encoding.Encoding.basis_pattern = string.split(options.basis_pattern, ",")
115    if len(UTF_encoding.Encoding.basis_pattern) == 1:
116        # If we have the default basis pattern string then adjust it
117        # for UTF-16 or UTF-32.  If the encoding is UTF-8 then we will
118        # leave it as is.
119        if "basis_bits.bit_%i" in UTF_encoding.Encoding.basis_pattern[0]:
120            if UTF_encoding.UTF16.name in UTF_encoding.Encoding.name:
121                UTF_encoding.Encoding.basis_pattern[0] = "u16_bit%i"
122            elif UTF_encoding.UTF32.name in UTF_encoding.Encoding.name:
123                UTF_encoding.Encoding.basis_pattern[0] = "u32_bit%i"
124    elif len(UTF_encoding.Encoding.basis_pattern) == 2:
125        if UTF_encoding.UTF16.name not in UTF_encoding.Encoding.name:
126            print "ERROR: Invalid encoding for the basis pattern variables."
127            return
128    elif len(UTF_encoding.Encoding.basis_pattern) == 3:
129        if UTF_encoding.UTF32.name not in UTF_encoding.Encoding.name:
130            print "ERROR: Invalid encoding for the basis pattern variables."
131            return
132    else:
133        print "ERROR: Invalid number of basis pattern variables."
134        return
135               
136           
137    # Positional arguments
138    if (len(args) == 1):
139        # if the specified argument is not in the DefinitionSet, then assume that it's a filename
140        if args[0] not in DefinitionSet:
141            #define the characters in the list
142            defs = charset_input_parser.input_chardef(args[0])
143            if UTF_encoding.Encoding.encoding_error == True:
144               if UTF_encoding.Encoding.default:
145                  print "ERROR: The input file contains characters with mixed encodings."
146               else:
147                  print ''.join(["ERROR: The input file contains encodings that are not ",
148                                  UTF_encoding.Encoding.name, "."])
149               return
150        else: defs = DefinitionSet[args[1]]
151        if options.use_EBCDIC:
152            defs = EBCDIC.ascii2ebcdic_chardeflist(defs)
153        cgo = CC_compiler(UTF_encoding.Encoding, options.gensym_pattern, options.little_endian)
154        stmts = cgo.chardeflist2py(defs)
155        if options.Pablo_skeleton or options.test_skeleton:
156          b = string.split(options.basis_pattern, ".")
157          if len(b) == 2: 
158            basis_struct = string.upper(b[0][0]) + b[0][1:]
159            basis_struct_var = b[0]
160            bit_pattern = b[1]
161          else: 
162            basis_struct = 'Bits'
163            basis_stuct_var = 'bits'
164            bit_pattern = bit[0]
165          struct_defs = "class %s():\n" % basis_struct
166          for i in range(8): struct_defs += "\t" + bit_pattern % i + " = 0\n"
167          struct_sets = {}
168          for d in defs:
169            n = string.split(d.name, ".")
170            if len(n) == 2:
171              if not n[0] in struct_sets.keys(): struct_sets[n[0]] = []
172              struct_sets[n[0]].append(n[1])
173          for k in struct_sets.keys():
174            struct_defs += "\nclass %s():\n" % (string.upper(k[0])+k[1:])
175            for f in struct_sets[k]: struct_defs += "\t" + f + " = 0\n"
176          print struct_defs
177          params = ", ".join([basis_struct_var] + struct_sets.keys())
178          print "\ndef Do_defs(%s):\n" % params
179          print stmts
180          if options.test_skeleton:
181            for d in defs:
182              print '\tprint_register<BitBlock>("%s",%s);\n' % (d.name, d.name)
183          print "\ndef main():\n\tDo_defs(%s)\n" % params
184        else: 
185           print stmts
186           #fo = open("icgrep_dev/Z_equations.txt", "wb")
187           #fo.write(stmts);
188
189           # Close opend file
190           #fo.close()
191    else:
192        option_parser.print_usage()
193       
194
195if __name__ == "__main__": main()
196
Note: See TracBrowser for help on using the repository browser.