blob: a3e51b7aae58b2aa25001fafb9f1b6c492ba32c0 [file] [log] [blame]
Jeremy Hyltonf968e852000-02-04 00:25:23 +00001import types
Jeremy Hylton9605c112000-02-08 18:57:32 +00002from consts import CO_VARARGS, CO_VARKEYWORDS
Jeremy Hyltonf968e852000-02-04 00:25:23 +00003
4nodes = {}
5
6def 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
18
19def 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
32
33class 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))
51
52class EmptyNode(Node):
53 def __init__(self):
54 self.lineno = None
55
56class Module(Node):
57 nodes['module'] = 'Module'
58
59 def __init__(self, doc, node):
60 self.doc = doc
61 self.node = node
62 self._children = ('module', doc, node)
63
64 def __repr__(self):
65 return "Module(%s,%s)" % self._children[1:]
66
67class Stmt(Node):
68 nodes['stmt'] = 'Stmt'
69
70 def __init__(self, nodes):
71 self.nodes = nodes
72 self._children = ('stmt', nodes)
73
74 def __repr__(self):
75 return "Stmt(%s)" % self._children[1:]
76
77class Function(Node):
78 nodes['function'] = 'Function'
79
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)
Jeremy Hylton9605c112000-02-08 18:57:32 +000089 self.varargs = self.kwargs = None
90 if flags & CO_VARARGS:
91 self.varargs = 1
92 if flags & CO_VARKEYWORDS:
93 self.kwargs = 1
94
Jeremy Hyltonf968e852000-02-04 00:25:23 +000095
96 def __repr__(self):
97 return "Function(%s,%s,%s,%s,%s,%s)" % self._children[1:]
98
99class Lambda(Node):
100 nodes['lambda'] = 'Lambda'
101
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)
Jeremy Hylton7708d692000-02-17 22:06:20 +0000108 self.varargs = self.kwargs = None
109 if flags & CO_VARARGS:
110 self.varargs = 1
111 if flags & CO_VARKEYWORDS:
112 self.kwargs = 1
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000113
114 def __repr__(self):
115 return "Lambda(%s,%s,%s,%s)" % self._children[1:]
116
Jeremy Hyltonfa974a92000-03-06 18:50:48 +0000117class Class(Node):
118 nodes['class'] = 'Class'
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000119
120 def __init__(self, name, bases, doc, code):
121 self.name = name
122 self.bases = bases
123 self.doc = doc
124 self.code = code
Jeremy Hyltonfa974a92000-03-06 18:50:48 +0000125 self._children = ('class', name, bases, doc, code)
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000126
127 def __repr__(self):
Jeremy Hyltonfa974a92000-03-06 18:50:48 +0000128 return "Class(%s,%s,%s,%s)" % self._children[1:]
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000129
130class Pass(EmptyNode):
131 nodes['pass'] = 'Pass'
132 _children = ('pass',)
133 def __repr__(self):
134 return "Pass()"
135
136class Break(EmptyNode):
137 nodes['break'] = 'Break'
138 _children = ('break',)
139 def __repr__(self):
140 return "Break()"
141
142class Continue(EmptyNode):
143 nodes['continue'] = 'Continue'
144 _children = ('continue',)
145 def __repr__(self):
146 return "Continue()"
147
148class For(Node):
149 nodes['for'] = 'For'
150
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_)
157
158 def __repr__(self):
159 return "For(%s,%s,%s,%s)" % self._children[1:]
160
161class While(Node):
162 nodes['while'] = 'While'
163
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_)
169
170 def __repr__(self):
171 return "While(%s,%s,%s)" % self._children[1:]
172
173class If(Node):
174 """if: [ (testNode, suiteNode), ...], elseNode"""
175 nodes['if'] = 'If'
176
177 def __init__(self, tests, else_):
178 self.tests = tests
179 self.else_ = else_
180 self._children = ('if', tests, else_)
181
182 def __repr__(self):
183 return "If(%s,%s)" % self._children[1:]
184
185class Exec(Node):
186 nodes['exec'] = 'Exec'
187
Jeremy Hyltonbf6267e2000-02-14 18:34:11 +0000188 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)
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000193
194 def __repr__(self):
195 return "Exec(%s,%s,%s)" % self._children[1:]
196
197class From(Node):
198 nodes['from'] = 'From'
199
200 def __init__(self, modname, names):
201 self.modname = modname
202 self.names = names
203 self._children = ('from', modname, names)
204
205 def __repr__(self):
206 return "From(%s,%s)" % self._children[1:]
207
208class Import(Node):
209 nodes['import'] = 'Import'
210
211 def __init__(self, names):
212 self.names = names
213 self._children = ('import', names)
214
215 def __repr__(self):
216 return "Import(%s)" % self._children[1:]
217
218class Raise(Node):
219 nodes['raise'] = 'Raise'
220
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)
226
227 def __repr__(self):
228 return "Raise(%s,%s,%s)" % self._children[1:]
229
Jeremy Hyltonca1ad182000-02-15 21:30:00 +0000230class TryFinally(Node):
231 nodes['tryfinally'] = 'TryFinally'
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000232
Jeremy Hyltonca1ad182000-02-15 21:30:00 +0000233 def __init__(self, body, final):
234 self.body = body
235 self.final = final
236 self._children = ('tryfinally', body, final)
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000237
238 def __repr__(self):
Jeremy Hyltonca1ad182000-02-15 21:30:00 +0000239 return "TryFinally(%s,%s)" % self._children[1:]
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000240
Jeremy Hyltonca1ad182000-02-15 21:30:00 +0000241class TryExcept(Node):
242 """Try/Except body and handlers
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000243
Jeremy Hyltonca1ad182000-02-15 21:30:00 +0000244 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.
247 """
248 nodes['tryexcept'] = 'TryExcept'
249
250 def __init__(self, body, handlers, else_):
251 self.body = body
252 self.handlers = handlers
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000253 self.else_ = else_
Jeremy Hyltonca1ad182000-02-15 21:30:00 +0000254 self._children = ('tryexcept', body, handlers, else_)
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000255
256 def __repr__(self):
Jeremy Hyltonca1ad182000-02-15 21:30:00 +0000257 return "TryExcept(%s,%s,%s)" % self._children[1:]
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000258
259class Return(Node):
260 nodes['return'] = 'Return'
261
262 def __init__(self, value):
263 self.value = value
264 self._children = ('return', value)
265
266 def __repr__(self):
267 return "Return(%s)" % self._children[1:]
268
269class Const(Node):
270 nodes['const'] = 'Const'
271
272 def __init__(self, value):
273 self.value = value
274 self._children = ('const', value)
275
276 def __repr__(self):
277 return "Const(%s)" % self._children[1:]
278
279class Print(Node):
280 nodes['print'] = 'Print'
281
282 def __init__(self, nodes):
283 self.nodes = nodes
284 self._children = ('print', nodes)
285
286 def __repr__(self):
287 return "Print(%s)" % self._children[1:]
288
289class Printnl(Node):
290 nodes['printnl'] = 'Printnl'
291
292 def __init__(self, nodes):
293 self.nodes = nodes
294 self._children = ('printnl', nodes)
295
296 def __repr__(self):
297 return "Printnl(%s)" % self._children[1:]
298
299class Discard(Node):
300 nodes['discard'] = 'Discard'
301
302 def __init__(self, expr):
303 self.expr = expr
304 self._children = ('discard', expr)
305
306 def __repr__(self):
307 return "Discard(%s)" % self._children[1:]
308
309class Assign(Node):
310 nodes['assign'] = 'Assign'
311
312 def __init__(self, nodes, expr):
313 self.nodes = nodes
314 self.expr = expr
315 self._children = ('assign', nodes, expr)
316
317 def __repr__(self):
318 return "Assign(%s,%s)" % self._children[1:]
319
320class AssTuple(Node):
321 nodes['ass_tuple'] = 'AssTuple'
322
323 def __init__(self, nodes):
324 self.nodes = nodes
325 self._children = ('ass_tuple', nodes)
326
327 def __repr__(self):
328 return "AssTuple(%s)" % self._children[1:]
329
330class AssList(Node):
331 nodes['ass_list'] = 'AssList'
332
333 def __init__(self, nodes):
334 self.nodes = nodes
335 self._children = ('ass_list', nodes)
336
337 def __repr__(self):
338 return "AssList(%s)" % self._children[1:]
339
340class AssName(Node):
341 nodes['ass_name'] = 'AssName'
342
343 def __init__(self, name, flags):
344 self.name = name
345 self.flags = flags
346 self._children = ('ass_name', name, flags)
347
348 def __repr__(self):
349 return "AssName(%s,%s)" % self._children[1:]
350
351class AssAttr(Node):
352 nodes['ass_attr'] = 'AssAttr'
353
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)
359
360 def __repr__(self):
361 return "AssAttr(%s,%s,%s)" % self._children[1:]
362
363class List(Node):
364 nodes['list'] = 'List'
365
366 def __init__(self, nodes):
367 self.nodes = nodes
368 self._children = ('list', nodes)
369
370 def __repr__(self):
371 return "List(%s)" % self._children[1:]
372
373class Dict(Node):
374 nodes['dict'] = 'Dict'
375
Jeremy Hyltonbf6267e2000-02-14 18:34:11 +0000376 def __init__(self, items):
377 self.items = items
378 self._children = ('dict', items)
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000379
380 def __repr__(self):
381 return "Dict(%s)" % self._children[1:]
382
383class Not(Node):
384 nodes['not'] = 'Not'
385
386 def __init__(self, expr):
387 self.expr = expr
388 self._children = ('not', expr)
389
390 def __repr__(self):
391 return "Not(%s)" % self._children[1:]
392
393class Compare(Node):
394 nodes['compare'] = 'Compare'
395
396 def __init__(self, expr, ops):
397 self.expr = expr
398 self.ops = ops
399 self._children = ('compare', expr, ops)
400
401 def __repr__(self):
402 return "Compare(%s,%s)" % self._children[1:]
403
404class Name(Node):
405 nodes['name'] = 'Name'
406
407 def __init__(self, name):
408 self.name = name
409 self._children = ('name', name)
410
411 def __repr__(self):
412 return "Name(%s)" % self._children[1:]
413
414class Global(Node):
415 nodes['global'] = 'Global'
416
417 def __init__(self, names):
418 self.names = names
419 self._children = ('global', names)
420
421 def __repr__(self):
422 return "Global(%s)" % self._children[1:]
423
424class Backquote(Node):
425 nodes['backquote'] = 'Backquote'
426
427 def __init__(self, node):
Jeremy Hylton156a9752000-02-08 21:06:19 +0000428 self.expr = node
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000429 self._children = ('backquote', node)
430
431 def __repr__(self):
432 return "Backquote(%s)" % self._children[1:]
433
434class Getattr(Node):
435 nodes['getattr'] = 'Getattr'
436
437 def __init__(self, expr, attrname):
438 self.expr = expr
439 self.attrname = attrname
440 self._children = ('getattr', expr, attrname)
441
442 def __repr__(self):
443 return "Getattr(%s,%s)" % self._children[1:]
444
445class CallFunc(Node):
446 nodes['call_func'] = 'CallFunc'
447
Jeremy Hyltonbe317e62000-05-02 22:32:59 +0000448 def __init__(self, node, args, star_args = None, dstar_args = None):
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000449 self.node = node
450 self.args = args
Jeremy Hyltonbe317e62000-05-02 22:32:59 +0000451 self.star_args = star_args
452 self.dstar_args = dstar_args
453 self._children = ('call_func', node, args, star_args, dstar_args)
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000454
455 def __repr__(self):
Jeremy Hyltonbe317e62000-05-02 22:32:59 +0000456 return "CallFunc(%s,%s,*%s, **%s)" % self._children[1:]
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000457
458class Keyword(Node):
459 nodes['keyword'] = 'Keyword'
460
461 def __init__(self, name, expr):
462 self.name = name
463 self.expr = expr
464 self._children = ('keyword', name, expr)
465
466 def __repr__(self):
467 return "Keyword(%s,%s)" % self._children[1:]
468
469class Subscript(Node):
470 nodes['subscript'] = 'Subscript'
471
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)
477
478 def __repr__(self):
479 return "Subscript(%s,%s,%s)" % self._children[1:]
480
481class Ellipsis(EmptyNode):
482 nodes['ellipsis'] = 'Ellipsis'
483 _children = ('ellipsis',)
484 def __repr__(self):
485 return "Ellipsis()"
486
487class Sliceobj(Node):
488 nodes['sliceobj'] = 'Sliceobj'
489
490 def __init__(self, nodes):
491 self.nodes = nodes
492 self._children = ('sliceobj', nodes)
493
494 def __repr__(self):
495 return "Sliceobj(%s)" % self._children[1:]
496
497class Slice(Node):
498 nodes['slice'] = 'Slice'
499
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)
506
507 def __repr__(self):
508 return "Slice(%s,%s,%s,%s)" % self._children[1:]
509
510class Assert(Node):
511 nodes['assert'] = 'Assert'
512
Jeremy Hyltonbf6267e2000-02-14 18:34:11 +0000513 def __init__(self, test, fail):
514 self.test = test
515 self.fail = fail
516 self._children = ('assert', test, fail)
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000517
518 def __repr__(self):
519 return "Assert(%s,%s)" % self._children[1:]
520
521class Tuple(Node):
522 nodes['tuple'] = 'Tuple'
523
524 def __init__(self, nodes):
525 self.nodes = nodes
526 self._children = ('tuple', nodes)
527
528 def __repr__(self):
529 return "Tuple(%s)" % self._children[1:]
530
531class Or(Node):
532 nodes['or'] = 'Or'
533
534 def __init__(self, nodes):
535 self.nodes = nodes
536 self._children = ('or', nodes)
537
538 def __repr__(self):
539 return "Or(%s)" % self._children[1:]
540
541class And(Node):
542 nodes['and'] = 'And'
543
544 def __init__(self, nodes):
545 self.nodes = nodes
546 self._children = ('and', nodes)
547
548 def __repr__(self):
549 return "And(%s)" % self._children[1:]
550
551class Bitor(Node):
552 nodes['bitor'] = 'Bitor'
553
554 def __init__(self, nodes):
555 self.nodes = nodes
556 self._children = ('bitor', nodes)
557
558 def __repr__(self):
559 return "Bitor(%s)" % self._children[1:]
560
561class Bitxor(Node):
562 nodes['bitxor'] = 'Bitxor'
563
564 def __init__(self, nodes):
565 self.nodes = nodes
566 self._children = ('bitxor', nodes)
567
568 def __repr__(self):
569 return "Bitxor(%s)" % self._children[1:]
570
571class Bitand(Node):
572 nodes['bitand'] = 'Bitand'
573
574 def __init__(self, nodes):
575 self.nodes = nodes
576 self._children = ('bitand', nodes)
577
578 def __repr__(self):
579 return "Bitand(%s)" % self._children[1:]
580
581class LeftShift(Node):
582 nodes['<<'] = 'LeftShift'
583
Jeremy Hylton17988d22000-02-14 21:32:42 +0000584 def __init__(self, (left, right)):
585 self.left = left
586 self.right = right
587 self._children = ('<<', (left, right))
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000588
589 def __repr__(self):
Jeremy Hylton17988d22000-02-14 21:32:42 +0000590 return "LeftShift(%s)" % self._children[1:]
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000591
592class RightShift(Node):
593 nodes['>>'] = 'RightShift'
594
Jeremy Hylton17988d22000-02-14 21:32:42 +0000595 def __init__(self, (left, right)):
596 self.left = left
597 self.right = right
598 self._children = ('>>', (left, right))
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000599
600 def __repr__(self):
Jeremy Hylton17988d22000-02-14 21:32:42 +0000601 return "RightShift(%s)" % self._children[1:]
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000602
603class Add(Node):
604 nodes['+'] = 'Add'
605
606 def __init__(self, (left, right)):
607 self.left = left
608 self.right = right
609 self._children = ('+', (left, right))
610
611 def __repr__(self):
612 return "Add(%s)" % self._children[1:]
613
614class Sub(Node):
615 nodes['-'] = 'Sub'
616
617 def __init__(self, (left, right)):
618 self.left = left
619 self.right = right
620 self._children = ('-', (left, right))
621
622 def __repr__(self):
623 return "Sub(%s)" % self._children[1:]
624
625class Mul(Node):
626 nodes['*'] = 'Mul'
627
628 def __init__(self, (left, right)):
629 self.left = left
630 self.right = right
631 self._children = ('*', (left, right))
632
633 def __repr__(self):
634 return "Mul(%s)" % self._children[1:]
635
636class Div(Node):
637 nodes['/'] = 'Div'
638
639 def __init__(self, (left, right)):
640 self.left = left
641 self.right = right
642 self._children = ('/', (left, right))
643
644 def __repr__(self):
645 return "Div(%s)" % self._children[1:]
646
647class Mod(Node):
648 nodes['%'] = 'Mod'
649
650 def __init__(self, (left, right)):
651 self.left = left
652 self.right = right
653 self._children = ('%', (left, right))
654
655 def __repr__(self):
656 return "Mod(%s)" % self._children[1:]
657
658class Power(Node):
659 nodes['power'] = 'Power'
660
661 def __init__(self, (left, right)):
662 self.left = left
663 self.right = right
664 self._children = ('power', (left, right))
665
666 def __repr__(self):
667 return "Power(%s)" % self._children[1:]
668
669class UnaryAdd(Node):
670 nodes['unary+'] = 'UnaryAdd'
671
672 def __init__(self, node):
Jeremy Hylton156a9752000-02-08 21:06:19 +0000673 self.expr = node
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000674 self._children = ('unary+', node)
675
676 def __repr__(self):
677 return "UnaryAdd(%s)" % self._children[1:]
678
679class UnarySub(Node):
680 nodes['unary-'] = 'UnarySub'
681
682 def __init__(self, node):
Jeremy Hylton156a9752000-02-08 21:06:19 +0000683 self.expr = node
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000684 self._children = ('unary-', node)
685
686 def __repr__(self):
687 return "UnarySub(%s)" % self._children[1:]
688
689class Invert(Node):
690 nodes['invert'] = 'Invert'
691
692 def __init__(self, node):
Jeremy Hylton156a9752000-02-08 21:06:19 +0000693 self.expr = node
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000694 self._children = ('invert', node)
695
696 def __repr__(self):
697 return "Invert(%s)" % self._children[1:]
698
699# now clean up the nodes dictionary
700klasses = globals()
701for k in nodes.keys():
702 nodes[k] = klasses[nodes[k]]
703
704# Local Variables:
705# mode:python
706# indent-tabs-mode: nil
707# py-indent-offset: 2
708# py-smart-indentation: nil
709# End: