7 package_name = '{0:s}.'.format(sys.argv[1])
32 re_class = re.compile(
33 '([\t ]*)class ([A-Za-z_][A-Za-z0-9_]*)\(([A-Za-z_][A-Za-z0-9_.]*)'
35 re_element = re.compile(
36 '([\t ]*)# GENERATE ELEMENT\((([^()]|\([^()]*\))*)\)( BEGIN)?'
38 re_factory = re.compile(
39 '([\t ]*)# GENERATE FACTORY\(([^()]*)\)( BEGIN)?'
43 base_classes = [{'element.Element': []}] # params
45 line = sys.stdin.readline()
47 match = re_class.match(line)
49 sys.stdout.write(line)
50 indent = match.group(1)
51 class_name = match.group(2)
52 base_class = match.group(3)
53 while len(stack) and stack[-1][0][:len(indent)] == indent:
54 _, temp_class_name, _, _ = stack.pop()
55 for temp_base_class, temp_fields in base_classes.pop().items():
57 '{0:s}.{1:s}'.format(temp_class_name, temp_base_class)
59 for i in range(len(base_classes) - 1, -1, -1):
60 if base_class in base_classes[i]:
62 '.'.join([j for _, j, _, _ in stack] + [class_name])
64 full_base_class = '.'.join(
65 [j for _, j, _, _ in stack[:i]] + [base_class]
67 base_classes[-1][class_name] = list(base_classes[i][base_class])
70 full_base_class = base_class
71 stack.append((indent, class_name, base_class, full_base_class))
72 base_classes.append({})
74 match = re_element.match(line)
76 indent = match.group(1)
77 params = match.group(2)
78 begin = match.group(4)
80 while len(stack) and stack[-1][0][:len(indent)] == indent:
81 _, temp_class_name, _, _ = stack.pop()
82 for temp_base_class, temp_fields in base_classes.pop().items():
84 '{0:s}.{1:s}'.format(temp_class_name, temp_base_class)
86 _, class_name, base_class, full_base_class = stack[-1]
88 fields = params.split(',')
91 fields = [i.split() for i in fields]
92 fields = [(type, name) for [type, name] in fields]
93 i = len(base_classes[-2][class_name])
94 base_classes[-2][class_name].extend(fields)
97 '''{0:s}# GENERATE ELEMENT({1:s}) BEGIN
103 {8:s} children = []{9:s}
105 {11:s} {12:s}.__init__(
110 {17:s} children{18:s}
118 '_'.join([i for _, i, _, _ in stack]),
124 ',\n{0:s} {1:s} = {2:s}'.format(
129 for type, name in base_classes[-2][class_name]
142 ',\n{0:s} {1:s}'.format(
146 for type, name in base_classes[-2][class_name][:i]
152 for type, name in fields:
153 if type == 'ref' or type == 'list(ref)' or type == 'set(ref)' or type == 'str':
155 '''{0:s} self.{1:s} = {2:s}
156 '''.format(indent, name, name)
158 elif type[:5] == 'list(' and type[-1:] == ')':
161 '''{0:s} self.{1:s} = (
162 {2:s} [element.deserialize_{3:s}(i) for i in {4:s}.split()]
163 {5:s} if isinstance({6:s}, str) else
179 elif type[:4] == 'set(' and type[-1:] == ')':
182 '''{0:s} self.{1:s} = (
183 {2:s} set([element.deserialize_{3:s}(i) for i in {4:s}.split()])
184 {5:s} if isinstance({6:s}, str) else
202 '''{0:s} self.{1:s} = (
203 {2:s} element.deserialize_{3:s}({4:s})
204 {5:s} if isinstance({6:s}, str) else
222 '''{0:s}def serialize(self, ref_list):
223 {1:s} {2:s}.serialize(self, ref_list)
224 '''.format(indent, indent, full_base_class)
226 for type, name in fields:
227 if type[:5] == 'list(' and type[-1:] == ')':
232 {3:s} ' '.join([element.serialize_{4:s}(i{5:s}) for i in self.{6:s}])
240 ', ref_list' if subtype == 'ref' else '',
245 elif type[:4] == 'set(' and type[-1:] == ')':
250 {3:s} ' '.join([element.serialize_{4:s}(i{5:s}) for i in sorted(self.{6:s})])
258 ', ref_list' if subtype == 'ref' else '',
265 '''{0:s} self.set('{1:s}', element.serialize_{2:s}(self.{3:s}{4:s}))
271 ', ref_list' if type == 'ref' else ''
275 '''{0:s}def deserialize(self, ref_list):
276 {1:s} {2:s}.deserialize(self, ref_list)
277 '''.format(indent, indent, full_base_class)
279 for type, name in fields:
280 if type[:5] == 'list(' and type[-1:] == ')':
283 '''{0:s} self.{1:s} = [
284 {2:s} element.deserialize_{3:s}(i{4:s})
285 {5:s} for i in self.get('{6:s}', '').split()
292 ', ref_list' if subtype == 'ref' else '',
298 elif type[:4] == 'set(' and type[-1:] == ')':
301 '''{0:s} self.{1:s} = set(
303 {3:s} element.deserialize_{4:s}(i{5:s})
304 {6:s} for i in self.get('{7:s}', '').split()
313 ', ref_list' if subtype == 'ref' else '',
322 '''{0:s} self.{1:s} = element.deserialize_{2:s}(self.get('{3:s}', '{4:s}'){5:s})
328 default_value_str[type],
329 ', ref_list' if type == 'ref' else ''
333 '''{0:s}def copy(self, factory = None):
334 {1:s} result = {2:s}.copy(
336 {4:s} {5:s} if factory is None else factory
349 '\n{0:s} result.{1:s} = self.{2:s}'.format(
354 for _, name in fields
362 '''{0:s}def repr_serialize(self, params):
363 {1:s} {2:s}.repr_serialize(self, params)
370 for type, name in fields:
371 if type[:5] == 'list(' and type[-1:] == ')':
374 '''{0:s} if len(self.{1:s}):
376 {3:s} '{4:s} = [{{0:s}}]'.format(
377 {5:s} ', '.join([repr(i) for i in self.{6:s}])
392 elif type[:4] == 'set(' and type[-1:] == ')':
395 '''{0:s} if len(self.{1:s}):
397 {3:s} '{4:s} = set([{{0:s}}])'.format(
398 {5:s} ', '.join([repr(i) for i in sorted(self.{6:s})])
415 '''{0:s} if self.{1:s} != {2:s}:
417 {4:s} '{5:s} = {{0:s}}'.format(repr(self.{6:s}))
431 '''{0:s}def __repr__(self):
433 {2:s} self.repr_serialize(params)
434 {3:s} return '{4:s}{5:s}({{0:s}})'.format(', '.join(params))
442 '.'.join([i for _, i, _, _ in stack]),
446 if begin is not None:
447 line = sys.stdin.readline()
449 if line.strip() == '# GENERATE END':
451 line = sys.stdin.readline()
455 match = re_factory.match(line)
456 if match is not None:
457 indent = match.group(1)
458 param = match.group(2)
459 begin = match.group(3)
462 '''{0:s}# GENERATE FACTORY({1:s}) BEGIN
463 {2:s}tag_to_class = {{{3:s}
465 {5:s}def factory(tag, attrib = {{}}, *args, **kwargs):
466 {6:s} return tag_to_class.get(tag, {7:s})(tag, attrib, *args, **kwargs)
474 '\n{0:s} \'{1:s}\': {2:s}'.format(
490 if begin is not None:
491 line = sys.stdin.readline()
493 if line.strip() == '# GENERATE END':
495 line = sys.stdin.readline()
499 sys.stdout.write(line)
500 line = sys.stdin.readline()