blob: 22c1b040ae3b349159aa19d945c94d470f00de76 [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)
108
109 def __repr__(self):
110 return "Lambda(%s,%s,%s,%s)" % self._children[1:]
111
112class Classdef(Node):
113 nodes['classdef'] = 'Classdef'
114
115 def __init__(self, name, bases, doc, code):
116 self.name = name
117 self.bases = bases
118 self.doc = doc
119 self.code = code
120 self._children = ('classdef', name, bases, doc, code)
121
122 def __repr__(self):
123 return "Classdef(%s,%s,%s,%s)" % self._children[1:]
124
125class Pass(EmptyNode):
126 nodes['pass'] = 'Pass'
127 _children = ('pass',)
128 def __repr__(self):
129 return "Pass()"
130
131class Break(EmptyNode):
132 nodes['break'] = 'Break'
133 _children = ('break',)
134 def __repr__(self):
135 return "Break()"
136
137class Continue(EmptyNode):
138 nodes['continue'] = 'Continue'
139 _children = ('continue',)
140 def __repr__(self):
141 return "Continue()"
142
143class For(Node):
144 nodes['for'] = 'For'
145
146 def __init__(self, assign, list, body, else_):
147 self.assign = assign
148 self.list = list
149 self.body = body
150 self.else_ = else_
151 self._children = ('for', assign, list, body, else_)
152
153 def __repr__(self):
154 return "For(%s,%s,%s,%s)" % self._children[1:]
155
156class While(Node):
157 nodes['while'] = 'While'
158
159 def __init__(self, test, body, else_):
160 self.test = test
161 self.body = body
162 self.else_ = else_
163 self._children = ('while', test, body, else_)
164
165 def __repr__(self):
166 return "While(%s,%s,%s)" % self._children[1:]
167
168class If(Node):
169 """if: [ (testNode, suiteNode), ...], elseNode"""
170 nodes['if'] = 'If'
171
172 def __init__(self, tests, else_):
173 self.tests = tests
174 self.else_ = else_
175 self._children = ('if', tests, else_)
176
177 def __repr__(self):
178 return "If(%s,%s)" % self._children[1:]
179
180class Exec(Node):
181 nodes['exec'] = 'Exec'
182
Jeremy Hyltonbf6267e2000-02-14 18:34:11 +0000183 def __init__(self, expr, locals, globals):
184 self.expr = expr
185 self.locals = locals
186 self.globals = globals
187 self._children = ('exec', expr, locals, globals)
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000188
189 def __repr__(self):
190 return "Exec(%s,%s,%s)" % self._children[1:]
191
192class From(Node):
193 nodes['from'] = 'From'
194
195 def __init__(self, modname, names):
196 self.modname = modname
197 self.names = names
198 self._children = ('from', modname, names)
199
200 def __repr__(self):
201 return "From(%s,%s)" % self._children[1:]
202
203class Import(Node):
204 nodes['import'] = 'Import'
205
206 def __init__(self, names):
207 self.names = names
208 self._children = ('import', names)
209
210 def __repr__(self):
211 return "Import(%s)" % self._children[1:]
212
213class Raise(Node):
214 nodes['raise'] = 'Raise'
215
216 def __init__(self, expr1, expr2, expr3):
217 self.expr1 = expr1
218 self.expr2 = expr2
219 self.expr3 = expr3
220 self._children = ('raise', expr1, expr2, expr3)
221
222 def __repr__(self):
223 return "Raise(%s,%s,%s)" % self._children[1:]
224
225class Tryfinally(Node):
226 nodes['tryfinally'] = 'Tryfinally'
227
228 def __init__(self, try_, fin):
229 self.try_ = try_
230 self.fin = fin
231 self._children = ('tryfinally', try_, fin)
232
233 def __repr__(self):
234 return "Tryfinally(%s,%s)" % self._children[1:]
235
236class Tryexcept(Node):
237 nodes['tryexcept'] = 'Tryexcept'
238
239 def __init__(self, try_, excs, else_):
240 self.try_ = try_
241 self.excs = excs
242 self.else_ = else_
243 self._children = ('tryexcept', try_, excs, else_)
244
245 def __repr__(self):
246 return "Tryexcept(%s,%s,%s)" % self._children[1:]
247
248class Return(Node):
249 nodes['return'] = 'Return'
250
251 def __init__(self, value):
252 self.value = value
253 self._children = ('return', value)
254
255 def __repr__(self):
256 return "Return(%s)" % self._children[1:]
257
258class Const(Node):
259 nodes['const'] = 'Const'
260
261 def __init__(self, value):
262 self.value = value
263 self._children = ('const', value)
264
265 def __repr__(self):
266 return "Const(%s)" % self._children[1:]
267
268class Print(Node):
269 nodes['print'] = 'Print'
270
271 def __init__(self, nodes):
272 self.nodes = nodes
273 self._children = ('print', nodes)
274
275 def __repr__(self):
276 return "Print(%s)" % self._children[1:]
277
278class Printnl(Node):
279 nodes['printnl'] = 'Printnl'
280
281 def __init__(self, nodes):
282 self.nodes = nodes
283 self._children = ('printnl', nodes)
284
285 def __repr__(self):
286 return "Printnl(%s)" % self._children[1:]
287
288class Discard(Node):
289 nodes['discard'] = 'Discard'
290
291 def __init__(self, expr):
292 self.expr = expr
293 self._children = ('discard', expr)
294
295 def __repr__(self):
296 return "Discard(%s)" % self._children[1:]
297
298class Assign(Node):
299 nodes['assign'] = 'Assign'
300
301 def __init__(self, nodes, expr):
302 self.nodes = nodes
303 self.expr = expr
304 self._children = ('assign', nodes, expr)
305
306 def __repr__(self):
307 return "Assign(%s,%s)" % self._children[1:]
308
309class AssTuple(Node):
310 nodes['ass_tuple'] = 'AssTuple'
311
312 def __init__(self, nodes):
313 self.nodes = nodes
314 self._children = ('ass_tuple', nodes)
315
316 def __repr__(self):
317 return "AssTuple(%s)" % self._children[1:]
318
319class AssList(Node):
320 nodes['ass_list'] = 'AssList'
321
322 def __init__(self, nodes):
323 self.nodes = nodes
324 self._children = ('ass_list', nodes)
325
326 def __repr__(self):
327 return "AssList(%s)" % self._children[1:]
328
329class AssName(Node):
330 nodes['ass_name'] = 'AssName'
331
332 def __init__(self, name, flags):
333 self.name = name
334 self.flags = flags
335 self._children = ('ass_name', name, flags)
336
337 def __repr__(self):
338 return "AssName(%s,%s)" % self._children[1:]
339
340class AssAttr(Node):
341 nodes['ass_attr'] = 'AssAttr'
342
343 def __init__(self, expr, attrname, flags):
344 self.expr = expr
345 self.attrname = attrname
346 self.flags = flags
347 self._children = ('ass_attr', expr, attrname, flags)
348
349 def __repr__(self):
350 return "AssAttr(%s,%s,%s)" % self._children[1:]
351
352class List(Node):
353 nodes['list'] = 'List'
354
355 def __init__(self, nodes):
356 self.nodes = nodes
357 self._children = ('list', nodes)
358
359 def __repr__(self):
360 return "List(%s)" % self._children[1:]
361
362class Dict(Node):
363 nodes['dict'] = 'Dict'
364
Jeremy Hyltonbf6267e2000-02-14 18:34:11 +0000365 def __init__(self, items):
366 self.items = items
367 self._children = ('dict', items)
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000368
369 def __repr__(self):
370 return "Dict(%s)" % self._children[1:]
371
372class Not(Node):
373 nodes['not'] = 'Not'
374
375 def __init__(self, expr):
376 self.expr = expr
377 self._children = ('not', expr)
378
379 def __repr__(self):
380 return "Not(%s)" % self._children[1:]
381
382class Compare(Node):
383 nodes['compare'] = 'Compare'
384
385 def __init__(self, expr, ops):
386 self.expr = expr
387 self.ops = ops
388 self._children = ('compare', expr, ops)
389
390 def __repr__(self):
391 return "Compare(%s,%s)" % self._children[1:]
392
393class Name(Node):
394 nodes['name'] = 'Name'
395
396 def __init__(self, name):
397 self.name = name
398 self._children = ('name', name)
399
400 def __repr__(self):
401 return "Name(%s)" % self._children[1:]
402
403class Global(Node):
404 nodes['global'] = 'Global'
405
406 def __init__(self, names):
407 self.names = names
408 self._children = ('global', names)
409
410 def __repr__(self):
411 return "Global(%s)" % self._children[1:]
412
413class Backquote(Node):
414 nodes['backquote'] = 'Backquote'
415
416 def __init__(self, node):
Jeremy Hylton156a9752000-02-08 21:06:19 +0000417 self.expr = node
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000418 self._children = ('backquote', node)
419
420 def __repr__(self):
421 return "Backquote(%s)" % self._children[1:]
422
423class Getattr(Node):
424 nodes['getattr'] = 'Getattr'
425
426 def __init__(self, expr, attrname):
427 self.expr = expr
428 self.attrname = attrname
429 self._children = ('getattr', expr, attrname)
430
431 def __repr__(self):
432 return "Getattr(%s,%s)" % self._children[1:]
433
434class CallFunc(Node):
435 nodes['call_func'] = 'CallFunc'
436
437 def __init__(self, node, args):
438 self.node = node
439 self.args = args
440 self._children = ('call_func', node, args)
441
442 def __repr__(self):
443 return "CallFunc(%s,%s)" % self._children[1:]
444
445class Keyword(Node):
446 nodes['keyword'] = 'Keyword'
447
448 def __init__(self, name, expr):
449 self.name = name
450 self.expr = expr
451 self._children = ('keyword', name, expr)
452
453 def __repr__(self):
454 return "Keyword(%s,%s)" % self._children[1:]
455
456class Subscript(Node):
457 nodes['subscript'] = 'Subscript'
458
459 def __init__(self, expr, flags, subs):
460 self.expr = expr
461 self.flags = flags
462 self.subs = subs
463 self._children = ('subscript', expr, flags, subs)
464
465 def __repr__(self):
466 return "Subscript(%s,%s,%s)" % self._children[1:]
467
468class Ellipsis(EmptyNode):
469 nodes['ellipsis'] = 'Ellipsis'
470 _children = ('ellipsis',)
471 def __repr__(self):
472 return "Ellipsis()"
473
474class Sliceobj(Node):
475 nodes['sliceobj'] = 'Sliceobj'
476
477 def __init__(self, nodes):
478 self.nodes = nodes
479 self._children = ('sliceobj', nodes)
480
481 def __repr__(self):
482 return "Sliceobj(%s)" % self._children[1:]
483
484class Slice(Node):
485 nodes['slice'] = 'Slice'
486
487 def __init__(self, expr, flags, lower, upper):
488 self.expr = expr
489 self.flags = flags
490 self.lower = lower
491 self.upper = upper
492 self._children = ('slice', expr, flags, lower, upper)
493
494 def __repr__(self):
495 return "Slice(%s,%s,%s,%s)" % self._children[1:]
496
497class Assert(Node):
498 nodes['assert'] = 'Assert'
499
Jeremy Hyltonbf6267e2000-02-14 18:34:11 +0000500 def __init__(self, test, fail):
501 self.test = test
502 self.fail = fail
503 self._children = ('assert', test, fail)
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000504
505 def __repr__(self):
506 return "Assert(%s,%s)" % self._children[1:]
507
508class Tuple(Node):
509 nodes['tuple'] = 'Tuple'
510
511 def __init__(self, nodes):
512 self.nodes = nodes
513 self._children = ('tuple', nodes)
514
515 def __repr__(self):
516 return "Tuple(%s)" % self._children[1:]
517
518class Or(Node):
519 nodes['or'] = 'Or'
520
521 def __init__(self, nodes):
522 self.nodes = nodes
523 self._children = ('or', nodes)
524
525 def __repr__(self):
526 return "Or(%s)" % self._children[1:]
527
528class And(Node):
529 nodes['and'] = 'And'
530
531 def __init__(self, nodes):
532 self.nodes = nodes
533 self._children = ('and', nodes)
534
535 def __repr__(self):
536 return "And(%s)" % self._children[1:]
537
538class Bitor(Node):
539 nodes['bitor'] = 'Bitor'
540
541 def __init__(self, nodes):
542 self.nodes = nodes
543 self._children = ('bitor', nodes)
544
545 def __repr__(self):
546 return "Bitor(%s)" % self._children[1:]
547
548class Bitxor(Node):
549 nodes['bitxor'] = 'Bitxor'
550
551 def __init__(self, nodes):
552 self.nodes = nodes
553 self._children = ('bitxor', nodes)
554
555 def __repr__(self):
556 return "Bitxor(%s)" % self._children[1:]
557
558class Bitand(Node):
559 nodes['bitand'] = 'Bitand'
560
561 def __init__(self, nodes):
562 self.nodes = nodes
563 self._children = ('bitand', nodes)
564
565 def __repr__(self):
566 return "Bitand(%s)" % self._children[1:]
567
568class LeftShift(Node):
569 nodes['<<'] = 'LeftShift'
570
571 def __init__(self, (expr, shift)):
572 self.expr = expr
573 self.shift = shift
574 self._children = ('<<', (expr, shift))
575
576 def __repr__(self):
577 return "LeftShift(%s,%s)" % self._children[1:]
578
579class RightShift(Node):
580 nodes['>>'] = 'RightShift'
581
582 def __init__(self, (expr, shift)):
583 self.expr = expr
584 self.shift = shift
585 self._children = ('>>', (expr, shift))
586
587 def __repr__(self):
588 return "RightShift(%s,%s)" % self._children[1:]
589
590class Add(Node):
591 nodes['+'] = 'Add'
592
593 def __init__(self, (left, right)):
594 self.left = left
595 self.right = right
596 self._children = ('+', (left, right))
597
598 def __repr__(self):
599 return "Add(%s)" % self._children[1:]
600
601class Sub(Node):
602 nodes['-'] = 'Sub'
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 "Sub(%s)" % self._children[1:]
611
612class Mul(Node):
613 nodes['*'] = 'Mul'
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 "Mul(%s)" % self._children[1:]
622
623class Div(Node):
624 nodes['/'] = 'Div'
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 "Div(%s)" % self._children[1:]
633
634class Mod(Node):
635 nodes['%'] = 'Mod'
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 "Mod(%s)" % self._children[1:]
644
645class Power(Node):
646 nodes['power'] = 'Power'
647
648 def __init__(self, (left, right)):
649 self.left = left
650 self.right = right
651 self._children = ('power', (left, right))
652
653 def __repr__(self):
654 return "Power(%s)" % self._children[1:]
655
656class UnaryAdd(Node):
657 nodes['unary+'] = 'UnaryAdd'
658
659 def __init__(self, node):
Jeremy Hylton156a9752000-02-08 21:06:19 +0000660 self.expr = node
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000661 self._children = ('unary+', node)
662
663 def __repr__(self):
664 return "UnaryAdd(%s)" % self._children[1:]
665
666class UnarySub(Node):
667 nodes['unary-'] = 'UnarySub'
668
669 def __init__(self, node):
Jeremy Hylton156a9752000-02-08 21:06:19 +0000670 self.expr = node
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000671 self._children = ('unary-', node)
672
673 def __repr__(self):
674 return "UnarySub(%s)" % self._children[1:]
675
676class Invert(Node):
677 nodes['invert'] = 'Invert'
678
679 def __init__(self, node):
Jeremy Hylton156a9752000-02-08 21:06:19 +0000680 self.expr = node
Jeremy Hyltonf968e852000-02-04 00:25:23 +0000681 self._children = ('invert', node)
682
683 def __repr__(self):
684 return "Invert(%s)" % self._children[1:]
685
686# now clean up the nodes dictionary
687klasses = globals()
688for k in nodes.keys():
689 nodes[k] = klasses[nodes[k]]
690
691# Local Variables:
692# mode:python
693# indent-tabs-mode: nil
694# py-indent-offset: 2
695# py-smart-indentation: nil
696# End: