blob: 5686d8b4a0ebf6c97c99c1bd43f006a72ac57d95 [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
448 def __init__(self, node, args):
449 self.node = node
450 self.args = args
451 self._children = ('call_func', node, args)
452
453 def __repr__(self):
454 return "CallFunc(%s,%s)" % self._children[1:]
455
456class Keyword(Node):
457 nodes['keyword'] = 'Keyword'
458
459 def __init__(self, name, expr):
460 self.name = name
461 self.expr = expr
462 self._children = ('keyword', name, expr)
463
464 def __repr__(self):
465 return "Keyword(%s,%s)" % self._children[1:]
466
467class Subscript(Node):
468 nodes['subscript'] = 'Subscript'
469
470 def __init__(self, expr, flags, subs):
471 self.expr = expr
472 self.flags = flags
473 self.subs = subs
474 self._children = ('subscript', expr, flags, subs)
475
476 def __repr__(self):
477 return "Subscript(%s,%s,%s)" % self._children[1:]
478
479class Ellipsis(EmptyNode):
480 nodes['ellipsis'] = 'Ellipsis'
481 _children = ('ellipsis',)
482 def __repr__(self):
483 return "Ellipsis()"
484
485class Sliceobj(Node):
486 nodes['sliceobj'] = 'Sliceobj'
487
488 def __init__(self, nodes):
489 self.nodes = nodes
490 self._children = ('sliceobj', nodes)
491
492 def __repr__(self):
493 return "Sliceobj(%s)" % self._children[1:]
494
495class Slice(Node):
496 nodes['slice'] = 'Slice'
497
498 def __init__(self, expr, flags, lower, upper):
499 self.expr = expr
500 self.flags = flags
501 self.lower = lower
502 self.upper = upper
503 self._children = ('slice', expr, flags, lower, upper)
504
505 def __repr__(self):
506 return "Slice(%s,%s,%s,%s)" % self._children[1:]
507
508class Assert(Node):
509 nodes['assert'] = 'Assert'
510
Jeremy Hyltonbf6267e2000-02-14 18:34:11 +0000511 def __init__(self, test, fail):
512 self.test = test
513 self.fail = fail
514 self._children = ('assert', test, fail)
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000515
516 def __repr__(self):
517 return "Assert(%s,%s)" % self._children[1:]
518
519class Tuple(Node):
520 nodes['tuple'] = 'Tuple'
521
522 def __init__(self, nodes):
523 self.nodes = nodes
524 self._children = ('tuple', nodes)
525
526 def __repr__(self):
527 return "Tuple(%s)" % self._children[1:]
528
529class Or(Node):
530 nodes['or'] = 'Or'
531
532 def __init__(self, nodes):
533 self.nodes = nodes
534 self._children = ('or', nodes)
535
536 def __repr__(self):
537 return "Or(%s)" % self._children[1:]
538
539class And(Node):
540 nodes['and'] = 'And'
541
542 def __init__(self, nodes):
543 self.nodes = nodes
544 self._children = ('and', nodes)
545
546 def __repr__(self):
547 return "And(%s)" % self._children[1:]
548
549class Bitor(Node):
550 nodes['bitor'] = 'Bitor'
551
552 def __init__(self, nodes):
553 self.nodes = nodes
554 self._children = ('bitor', nodes)
555
556 def __repr__(self):
557 return "Bitor(%s)" % self._children[1:]
558
559class Bitxor(Node):
560 nodes['bitxor'] = 'Bitxor'
561
562 def __init__(self, nodes):
563 self.nodes = nodes
564 self._children = ('bitxor', nodes)
565
566 def __repr__(self):
567 return "Bitxor(%s)" % self._children[1:]
568
569class Bitand(Node):
570 nodes['bitand'] = 'Bitand'
571
572 def __init__(self, nodes):
573 self.nodes = nodes
574 self._children = ('bitand', nodes)
575
576 def __repr__(self):
577 return "Bitand(%s)" % self._children[1:]
578
579class LeftShift(Node):
580 nodes['<<'] = 'LeftShift'
581
Jeremy Hylton17988d22000-02-14 21:32:42 +0000582 def __init__(self, (left, right)):
583 self.left = left
584 self.right = right
585 self._children = ('<<', (left, right))
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000586
587 def __repr__(self):
Jeremy Hylton17988d22000-02-14 21:32:42 +0000588 return "LeftShift(%s)" % self._children[1:]
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000589
590class RightShift(Node):
591 nodes['>>'] = 'RightShift'
592
Jeremy Hylton17988d22000-02-14 21:32:42 +0000593 def __init__(self, (left, right)):
594 self.left = left
595 self.right = right
596 self._children = ('>>', (left, right))
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000597
598 def __repr__(self):
Jeremy Hylton17988d22000-02-14 21:32:42 +0000599 return "RightShift(%s)" % self._children[1:]
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000600
601class Add(Node):
602 nodes['+'] = 'Add'
603
604 def __init__(self, (left, right)):
605 self.left = left
606 self.right = right
607 self._children = ('+', (left, right))
608
609 def __repr__(self):
610 return "Add(%s)" % self._children[1:]
611
612class Sub(Node):
613 nodes['-'] = 'Sub'
614
615 def __init__(self, (left, right)):
616 self.left = left
617 self.right = right
618 self._children = ('-', (left, right))
619
620 def __repr__(self):
621 return "Sub(%s)" % self._children[1:]
622
623class Mul(Node):
624 nodes['*'] = 'Mul'
625
626 def __init__(self, (left, right)):
627 self.left = left
628 self.right = right
629 self._children = ('*', (left, right))
630
631 def __repr__(self):
632 return "Mul(%s)" % self._children[1:]
633
634class Div(Node):
635 nodes['/'] = 'Div'
636
637 def __init__(self, (left, right)):
638 self.left = left
639 self.right = right
640 self._children = ('/', (left, right))
641
642 def __repr__(self):
643 return "Div(%s)" % self._children[1:]
644
645class Mod(Node):
646 nodes['%'] = 'Mod'
647
648 def __init__(self, (left, right)):
649 self.left = left
650 self.right = right
651 self._children = ('%', (left, right))
652
653 def __repr__(self):
654 return "Mod(%s)" % self._children[1:]
655
656class Power(Node):
657 nodes['power'] = 'Power'
658
659 def __init__(self, (left, right)):
660 self.left = left
661 self.right = right
662 self._children = ('power', (left, right))
663
664 def __repr__(self):
665 return "Power(%s)" % self._children[1:]
666
667class UnaryAdd(Node):
668 nodes['unary+'] = 'UnaryAdd'
669
670 def __init__(self, node):
Jeremy Hylton156a9752000-02-08 21:06:19 +0000671 self.expr = node
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000672 self._children = ('unary+', node)
673
674 def __repr__(self):
675 return "UnaryAdd(%s)" % self._children[1:]
676
677class UnarySub(Node):
678 nodes['unary-'] = 'UnarySub'
679
680 def __init__(self, node):
Jeremy Hylton156a9752000-02-08 21:06:19 +0000681 self.expr = node
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000682 self._children = ('unary-', node)
683
684 def __repr__(self):
685 return "UnarySub(%s)" % self._children[1:]
686
687class Invert(Node):
688 nodes['invert'] = 'Invert'
689
690 def __init__(self, node):
Jeremy Hylton156a9752000-02-08 21:06:19 +0000691 self.expr = node
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000692 self._children = ('invert', node)
693
694 def __repr__(self):
695 return "Invert(%s)" % self._children[1:]
696
697# now clean up the nodes dictionary
698klasses = globals()
699for k in nodes.keys():
700 nodes[k] = klasses[nodes[k]]
701
702# Local Variables:
703# mode:python
704# indent-tabs-mode: nil
705# py-indent-offset: 2
706# py-smart-indentation: nil
707# End: