Bump version to 0.9.1.
[python/dscho.git] / Lib / compiler / ast.py
bloba3e51b7aae58b2aa25001fafb9f1b6c492ba32c0
1 import types
2 from consts import CO_VARARGS, CO_VARKEYWORDS
4 nodes = {}
6 def flatten(list):
7 l = []
8 for elt in list:
9 if type(elt) is types.TupleType:
10 for elt2 in flatten(elt):
11 l.append(elt2)
12 elif type(elt) is types.ListType:
13 for elt2 in flatten(elt):
14 l.append(elt2)
15 else:
16 l.append(elt)
17 return l
19 def asList(nodes):
20 l = []
21 for item in nodes:
22 if hasattr(item, "asList"):
23 l.append(item.asList())
24 else:
25 if type(item) is types.TupleType:
26 l.append(tuple(asList(item)))
27 elif type(item) is types.ListType:
28 l.append(asList(item))
29 else:
30 l.append(item)
31 return l
33 class Node:
34 def __init__(self, *args):
35 self._children = args
36 self.lineno = None
37 def __getitem__(self, index):
38 return self._children[index]
39 def __repr__(self):
40 return "<Node %s>" % self._children[0]
41 def __len__(self):
42 return len(self._children)
43 def __getslice__(self, low, high):
44 return self._children[low:high]
45 def getChildren(self):
46 return tuple(flatten(self._children[1:]))
47 def getType(self):
48 return self._children[0]
49 def asList(self):
50 return tuple(asList(self._children))
52 class EmptyNode(Node):
53 def __init__(self):
54 self.lineno = None
56 class Module(Node):
57 nodes['module'] = 'Module'
59 def __init__(self, doc, node):
60 self.doc = doc
61 self.node = node
62 self._children = ('module', doc, node)
64 def __repr__(self):
65 return "Module(%s,%s)" % self._children[1:]
67 class Stmt(Node):
68 nodes['stmt'] = 'Stmt'
70 def __init__(self, nodes):
71 self.nodes = nodes
72 self._children = ('stmt', nodes)
74 def __repr__(self):
75 return "Stmt(%s)" % self._children[1:]
77 class Function(Node):
78 nodes['function'] = 'Function'
80 def __init__(self, name, argnames, defaults, flags, doc, code):
81 self.name = name
82 self.argnames = argnames
83 self.defaults = defaults
84 self.flags = flags
85 self.doc = doc
86 self.code = code
87 self._children = ('function',
88 name, argnames, defaults, flags, doc, code)
89 self.varargs = self.kwargs = None
90 if flags & CO_VARARGS:
91 self.varargs = 1
92 if flags & CO_VARKEYWORDS:
93 self.kwargs = 1
96 def __repr__(self):
97 return "Function(%s,%s,%s,%s,%s,%s)" % self._children[1:]
99 class Lambda(Node):
100 nodes['lambda'] = 'Lambda'
102 def __init__(self, argnames, defaults, flags, code):
103 self.argnames = argnames
104 self.defaults = defaults
105 self.flags = flags
106 self.code = code
107 self._children = ('lambda', argnames, defaults, flags, code)
108 self.varargs = self.kwargs = None
109 if flags & CO_VARARGS:
110 self.varargs = 1
111 if flags & CO_VARKEYWORDS:
112 self.kwargs = 1
114 def __repr__(self):
115 return "Lambda(%s,%s,%s,%s)" % self._children[1:]
117 class Class(Node):
118 nodes['class'] = 'Class'
120 def __init__(self, name, bases, doc, code):
121 self.name = name
122 self.bases = bases
123 self.doc = doc
124 self.code = code
125 self._children = ('class', name, bases, doc, code)
127 def __repr__(self):
128 return "Class(%s,%s,%s,%s)" % self._children[1:]
130 class Pass(EmptyNode):
131 nodes['pass'] = 'Pass'
132 _children = ('pass',)
133 def __repr__(self):
134 return "Pass()"
136 class Break(EmptyNode):
137 nodes['break'] = 'Break'
138 _children = ('break',)
139 def __repr__(self):
140 return "Break()"
142 class Continue(EmptyNode):
143 nodes['continue'] = 'Continue'
144 _children = ('continue',)
145 def __repr__(self):
146 return "Continue()"
148 class For(Node):
149 nodes['for'] = 'For'
151 def __init__(self, assign, list, body, else_):
152 self.assign = assign
153 self.list = list
154 self.body = body
155 self.else_ = else_
156 self._children = ('for', assign, list, body, else_)
158 def __repr__(self):
159 return "For(%s,%s,%s,%s)" % self._children[1:]
161 class While(Node):
162 nodes['while'] = 'While'
164 def __init__(self, test, body, else_):
165 self.test = test
166 self.body = body
167 self.else_ = else_
168 self._children = ('while', test, body, else_)
170 def __repr__(self):
171 return "While(%s,%s,%s)" % self._children[1:]
173 class If(Node):
174 """if: [ (testNode, suiteNode), ...], elseNode"""
175 nodes['if'] = 'If'
177 def __init__(self, tests, else_):
178 self.tests = tests
179 self.else_ = else_
180 self._children = ('if', tests, else_)
182 def __repr__(self):
183 return "If(%s,%s)" % self._children[1:]
185 class Exec(Node):
186 nodes['exec'] = 'Exec'
188 def __init__(self, expr, locals, globals):
189 self.expr = expr
190 self.locals = locals
191 self.globals = globals
192 self._children = ('exec', expr, locals, globals)
194 def __repr__(self):
195 return "Exec(%s,%s,%s)" % self._children[1:]
197 class From(Node):
198 nodes['from'] = 'From'
200 def __init__(self, modname, names):
201 self.modname = modname
202 self.names = names
203 self._children = ('from', modname, names)
205 def __repr__(self):
206 return "From(%s,%s)" % self._children[1:]
208 class Import(Node):
209 nodes['import'] = 'Import'
211 def __init__(self, names):
212 self.names = names
213 self._children = ('import', names)
215 def __repr__(self):
216 return "Import(%s)" % self._children[1:]
218 class Raise(Node):
219 nodes['raise'] = 'Raise'
221 def __init__(self, expr1, expr2, expr3):
222 self.expr1 = expr1
223 self.expr2 = expr2
224 self.expr3 = expr3
225 self._children = ('raise', expr1, expr2, expr3)
227 def __repr__(self):
228 return "Raise(%s,%s,%s)" % self._children[1:]
230 class TryFinally(Node):
231 nodes['tryfinally'] = 'TryFinally'
233 def __init__(self, body, final):
234 self.body = body
235 self.final = final
236 self._children = ('tryfinally', body, final)
238 def __repr__(self):
239 return "TryFinally(%s,%s)" % self._children[1:]
241 class TryExcept(Node):
242 """Try/Except body and handlers
244 The handlers attribute is a sequence of tuples. The elements of the
245 tuple are the exception name, the name to bind the exception to, and
246 the body of the except clause.
248 nodes['tryexcept'] = 'TryExcept'
250 def __init__(self, body, handlers, else_):
251 self.body = body
252 self.handlers = handlers
253 self.else_ = else_
254 self._children = ('tryexcept', body, handlers, else_)
256 def __repr__(self):
257 return "TryExcept(%s,%s,%s)" % self._children[1:]
259 class Return(Node):
260 nodes['return'] = 'Return'
262 def __init__(self, value):
263 self.value = value
264 self._children = ('return', value)
266 def __repr__(self):
267 return "Return(%s)" % self._children[1:]
269 class Const(Node):
270 nodes['const'] = 'Const'
272 def __init__(self, value):
273 self.value = value
274 self._children = ('const', value)
276 def __repr__(self):
277 return "Const(%s)" % self._children[1:]
279 class Print(Node):
280 nodes['print'] = 'Print'
282 def __init__(self, nodes):
283 self.nodes = nodes
284 self._children = ('print', nodes)
286 def __repr__(self):
287 return "Print(%s)" % self._children[1:]
289 class Printnl(Node):
290 nodes['printnl'] = 'Printnl'
292 def __init__(self, nodes):
293 self.nodes = nodes
294 self._children = ('printnl', nodes)
296 def __repr__(self):
297 return "Printnl(%s)" % self._children[1:]
299 class Discard(Node):
300 nodes['discard'] = 'Discard'
302 def __init__(self, expr):
303 self.expr = expr
304 self._children = ('discard', expr)
306 def __repr__(self):
307 return "Discard(%s)" % self._children[1:]
309 class Assign(Node):
310 nodes['assign'] = 'Assign'
312 def __init__(self, nodes, expr):
313 self.nodes = nodes
314 self.expr = expr
315 self._children = ('assign', nodes, expr)
317 def __repr__(self):
318 return "Assign(%s,%s)" % self._children[1:]
320 class AssTuple(Node):
321 nodes['ass_tuple'] = 'AssTuple'
323 def __init__(self, nodes):
324 self.nodes = nodes
325 self._children = ('ass_tuple', nodes)
327 def __repr__(self):
328 return "AssTuple(%s)" % self._children[1:]
330 class AssList(Node):
331 nodes['ass_list'] = 'AssList'
333 def __init__(self, nodes):
334 self.nodes = nodes
335 self._children = ('ass_list', nodes)
337 def __repr__(self):
338 return "AssList(%s)" % self._children[1:]
340 class AssName(Node):
341 nodes['ass_name'] = 'AssName'
343 def __init__(self, name, flags):
344 self.name = name
345 self.flags = flags
346 self._children = ('ass_name', name, flags)
348 def __repr__(self):
349 return "AssName(%s,%s)" % self._children[1:]
351 class AssAttr(Node):
352 nodes['ass_attr'] = 'AssAttr'
354 def __init__(self, expr, attrname, flags):
355 self.expr = expr
356 self.attrname = attrname
357 self.flags = flags
358 self._children = ('ass_attr', expr, attrname, flags)
360 def __repr__(self):
361 return "AssAttr(%s,%s,%s)" % self._children[1:]
363 class List(Node):
364 nodes['list'] = 'List'
366 def __init__(self, nodes):
367 self.nodes = nodes
368 self._children = ('list', nodes)
370 def __repr__(self):
371 return "List(%s)" % self._children[1:]
373 class Dict(Node):
374 nodes['dict'] = 'Dict'
376 def __init__(self, items):
377 self.items = items
378 self._children = ('dict', items)
380 def __repr__(self):
381 return "Dict(%s)" % self._children[1:]
383 class Not(Node):
384 nodes['not'] = 'Not'
386 def __init__(self, expr):
387 self.expr = expr
388 self._children = ('not', expr)
390 def __repr__(self):
391 return "Not(%s)" % self._children[1:]
393 class Compare(Node):
394 nodes['compare'] = 'Compare'
396 def __init__(self, expr, ops):
397 self.expr = expr
398 self.ops = ops
399 self._children = ('compare', expr, ops)
401 def __repr__(self):
402 return "Compare(%s,%s)" % self._children[1:]
404 class Name(Node):
405 nodes['name'] = 'Name'
407 def __init__(self, name):
408 self.name = name
409 self._children = ('name', name)
411 def __repr__(self):
412 return "Name(%s)" % self._children[1:]
414 class Global(Node):
415 nodes['global'] = 'Global'
417 def __init__(self, names):
418 self.names = names
419 self._children = ('global', names)
421 def __repr__(self):
422 return "Global(%s)" % self._children[1:]
424 class Backquote(Node):
425 nodes['backquote'] = 'Backquote'
427 def __init__(self, node):
428 self.expr = node
429 self._children = ('backquote', node)
431 def __repr__(self):
432 return "Backquote(%s)" % self._children[1:]
434 class Getattr(Node):
435 nodes['getattr'] = 'Getattr'
437 def __init__(self, expr, attrname):
438 self.expr = expr
439 self.attrname = attrname
440 self._children = ('getattr', expr, attrname)
442 def __repr__(self):
443 return "Getattr(%s,%s)" % self._children[1:]
445 class CallFunc(Node):
446 nodes['call_func'] = 'CallFunc'
448 def __init__(self, node, args, star_args = None, dstar_args = None):
449 self.node = node
450 self.args = args
451 self.star_args = star_args
452 self.dstar_args = dstar_args
453 self._children = ('call_func', node, args, star_args, dstar_args)
455 def __repr__(self):
456 return "CallFunc(%s,%s,*%s, **%s)" % self._children[1:]
458 class Keyword(Node):
459 nodes['keyword'] = 'Keyword'
461 def __init__(self, name, expr):
462 self.name = name
463 self.expr = expr
464 self._children = ('keyword', name, expr)
466 def __repr__(self):
467 return "Keyword(%s,%s)" % self._children[1:]
469 class Subscript(Node):
470 nodes['subscript'] = 'Subscript'
472 def __init__(self, expr, flags, subs):
473 self.expr = expr
474 self.flags = flags
475 self.subs = subs
476 self._children = ('subscript', expr, flags, subs)
478 def __repr__(self):
479 return "Subscript(%s,%s,%s)" % self._children[1:]
481 class Ellipsis(EmptyNode):
482 nodes['ellipsis'] = 'Ellipsis'
483 _children = ('ellipsis',)
484 def __repr__(self):
485 return "Ellipsis()"
487 class Sliceobj(Node):
488 nodes['sliceobj'] = 'Sliceobj'
490 def __init__(self, nodes):
491 self.nodes = nodes
492 self._children = ('sliceobj', nodes)
494 def __repr__(self):
495 return "Sliceobj(%s)" % self._children[1:]
497 class Slice(Node):
498 nodes['slice'] = 'Slice'
500 def __init__(self, expr, flags, lower, upper):
501 self.expr = expr
502 self.flags = flags
503 self.lower = lower
504 self.upper = upper
505 self._children = ('slice', expr, flags, lower, upper)
507 def __repr__(self):
508 return "Slice(%s,%s,%s,%s)" % self._children[1:]
510 class Assert(Node):
511 nodes['assert'] = 'Assert'
513 def __init__(self, test, fail):
514 self.test = test
515 self.fail = fail
516 self._children = ('assert', test, fail)
518 def __repr__(self):
519 return "Assert(%s,%s)" % self._children[1:]
521 class Tuple(Node):
522 nodes['tuple'] = 'Tuple'
524 def __init__(self, nodes):
525 self.nodes = nodes
526 self._children = ('tuple', nodes)
528 def __repr__(self):
529 return "Tuple(%s)" % self._children[1:]
531 class Or(Node):
532 nodes['or'] = 'Or'
534 def __init__(self, nodes):
535 self.nodes = nodes
536 self._children = ('or', nodes)
538 def __repr__(self):
539 return "Or(%s)" % self._children[1:]
541 class And(Node):
542 nodes['and'] = 'And'
544 def __init__(self, nodes):
545 self.nodes = nodes
546 self._children = ('and', nodes)
548 def __repr__(self):
549 return "And(%s)" % self._children[1:]
551 class Bitor(Node):
552 nodes['bitor'] = 'Bitor'
554 def __init__(self, nodes):
555 self.nodes = nodes
556 self._children = ('bitor', nodes)
558 def __repr__(self):
559 return "Bitor(%s)" % self._children[1:]
561 class Bitxor(Node):
562 nodes['bitxor'] = 'Bitxor'
564 def __init__(self, nodes):
565 self.nodes = nodes
566 self._children = ('bitxor', nodes)
568 def __repr__(self):
569 return "Bitxor(%s)" % self._children[1:]
571 class Bitand(Node):
572 nodes['bitand'] = 'Bitand'
574 def __init__(self, nodes):
575 self.nodes = nodes
576 self._children = ('bitand', nodes)
578 def __repr__(self):
579 return "Bitand(%s)" % self._children[1:]
581 class LeftShift(Node):
582 nodes['<<'] = 'LeftShift'
584 def __init__(self, (left, right)):
585 self.left = left
586 self.right = right
587 self._children = ('<<', (left, right))
589 def __repr__(self):
590 return "LeftShift(%s)" % self._children[1:]
592 class RightShift(Node):
593 nodes['>>'] = 'RightShift'
595 def __init__(self, (left, right)):
596 self.left = left
597 self.right = right
598 self._children = ('>>', (left, right))
600 def __repr__(self):
601 return "RightShift(%s)" % self._children[1:]
603 class Add(Node):
604 nodes['+'] = 'Add'
606 def __init__(self, (left, right)):
607 self.left = left
608 self.right = right
609 self._children = ('+', (left, right))
611 def __repr__(self):
612 return "Add(%s)" % self._children[1:]
614 class Sub(Node):
615 nodes['-'] = 'Sub'
617 def __init__(self, (left, right)):
618 self.left = left
619 self.right = right
620 self._children = ('-', (left, right))
622 def __repr__(self):
623 return "Sub(%s)" % self._children[1:]
625 class Mul(Node):
626 nodes['*'] = 'Mul'
628 def __init__(self, (left, right)):
629 self.left = left
630 self.right = right
631 self._children = ('*', (left, right))
633 def __repr__(self):
634 return "Mul(%s)" % self._children[1:]
636 class Div(Node):
637 nodes['/'] = 'Div'
639 def __init__(self, (left, right)):
640 self.left = left
641 self.right = right
642 self._children = ('/', (left, right))
644 def __repr__(self):
645 return "Div(%s)" % self._children[1:]
647 class Mod(Node):
648 nodes['%'] = 'Mod'
650 def __init__(self, (left, right)):
651 self.left = left
652 self.right = right
653 self._children = ('%', (left, right))
655 def __repr__(self):
656 return "Mod(%s)" % self._children[1:]
658 class Power(Node):
659 nodes['power'] = 'Power'
661 def __init__(self, (left, right)):
662 self.left = left
663 self.right = right
664 self._children = ('power', (left, right))
666 def __repr__(self):
667 return "Power(%s)" % self._children[1:]
669 class UnaryAdd(Node):
670 nodes['unary+'] = 'UnaryAdd'
672 def __init__(self, node):
673 self.expr = node
674 self._children = ('unary+', node)
676 def __repr__(self):
677 return "UnaryAdd(%s)" % self._children[1:]
679 class UnarySub(Node):
680 nodes['unary-'] = 'UnarySub'
682 def __init__(self, node):
683 self.expr = node
684 self._children = ('unary-', node)
686 def __repr__(self):
687 return "UnarySub(%s)" % self._children[1:]
689 class Invert(Node):
690 nodes['invert'] = 'Invert'
692 def __init__(self, node):
693 self.expr = node
694 self._children = ('invert', node)
696 def __repr__(self):
697 return "Invert(%s)" % self._children[1:]
699 # now clean up the nodes dictionary
700 klasses = globals()
701 for k in nodes.keys():
702 nodes[k] = klasses[nodes[k]]
704 # Local Variables:
705 # mode:python
706 # indent-tabs-mode: nil
707 # py-indent-offset: 2
708 # py-smart-indentation: nil
709 # End: