annotate Tools/compiler/astgen.py @ 54294:dba767bc3155 legacy-trunk

remove mention of old ctypes version
author Benjamin Peterson <benjamin@python.org>
date Sat, 23 May 2009 20:59:09 +0000
parents 1d84bf5f9478
children 751c6dd71b5e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
1 """Generate ast module from specification
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
2
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
3 This script generates the ast module from a simple specification,
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
4 which makes it easy to accomodate changes in the grammar. This
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
5 approach would be quite reasonable if the grammar changed often.
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
6 Instead, it is rather complex to generate the appropriate code. And
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
7 the Node interface has changed more often than the grammar.
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
8 """
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
9
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
10 import fileinput
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
11 import re
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
12 import sys
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
13 from StringIO import StringIO
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
14
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
15 SPEC = "ast.txt"
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
16 COMMA = ", "
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
17
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
18 def load_boilerplate(file):
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
19 f = open(file)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
20 buf = f.read()
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
21 f.close()
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
22 i = buf.find('### ''PROLOGUE')
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
23 j = buf.find('### ''EPILOGUE')
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
24 pro = buf[i+12:j].strip()
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
25 epi = buf[j+12:].strip()
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
26 return pro, epi
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
27
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
28 def strip_default(arg):
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
29 """Return the argname from an 'arg = default' string"""
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
30 i = arg.find('=')
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
31 if i == -1:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
32 return arg
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
33 t = arg[:i].strip()
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
34 return t
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
35
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
36 P_NODE = 1
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
37 P_OTHER = 2
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
38 P_NESTED = 3
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
39 P_NONE = 4
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
40
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
41 class NodeInfo:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
42 """Each instance describes a specific AST node"""
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
43 def __init__(self, name, args):
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
44 self.name = name
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
45 self.args = args.strip()
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
46 self.argnames = self.get_argnames()
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
47 self.argprops = self.get_argprops()
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
48 self.nargs = len(self.argnames)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
49 self.init = []
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
50
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
51 def get_argnames(self):
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
52 if '(' in self.args:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
53 i = self.args.find('(')
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
54 j = self.args.rfind(')')
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
55 args = self.args[i+1:j]
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
56 else:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
57 args = self.args
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
58 return [strip_default(arg.strip())
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
59 for arg in args.split(',') if arg]
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
60
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
61 def get_argprops(self):
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
62 """Each argument can have a property like '*' or '!'
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
63
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
64 XXX This method modifies the argnames in place!
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
65 """
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
66 d = {}
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
67 hardest_arg = P_NODE
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
68 for i in range(len(self.argnames)):
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
69 arg = self.argnames[i]
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
70 if arg.endswith('*'):
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
71 arg = self.argnames[i] = arg[:-1]
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
72 d[arg] = P_OTHER
19944
d940af525840 Fix calculation of hardest_arg.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19557
diff changeset
73 hardest_arg = max(hardest_arg, P_OTHER)
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
74 elif arg.endswith('!'):
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
75 arg = self.argnames[i] = arg[:-1]
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
76 d[arg] = P_NESTED
19944
d940af525840 Fix calculation of hardest_arg.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19557
diff changeset
77 hardest_arg = max(hardest_arg, P_NESTED)
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
78 elif arg.endswith('&'):
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
79 arg = self.argnames[i] = arg[:-1]
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
80 d[arg] = P_NONE
19944
d940af525840 Fix calculation of hardest_arg.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19557
diff changeset
81 hardest_arg = max(hardest_arg, P_NONE)
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
82 else:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
83 d[arg] = P_NODE
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
84 self.hardest_arg = hardest_arg
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
85
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
86 if hardest_arg > P_NODE:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
87 self.args = self.args.replace('*', '')
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
88 self.args = self.args.replace('!', '')
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
89 self.args = self.args.replace('&', '')
32736
c3a096bfbd6b Whitespace normalization, via reindent.py.
Tim Peters <tim.peters@gmail.com>
parents: 19944
diff changeset
90
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
91 return d
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
92
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
93 def gen_source(self):
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
94 buf = StringIO()
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
95 print >> buf, "class %s(Node):" % self.name
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
96 self._gen_init(buf)
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
97 print >> buf
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
98 self._gen_getChildren(buf)
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
99 print >> buf
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
100 self._gen_getChildNodes(buf)
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
101 print >> buf
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
102 self._gen_repr(buf)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
103 buf.seek(0, 0)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
104 return buf.read()
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
105
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
106 def _gen_init(self, buf):
33421
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
107 if self.args:
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
108 print >> buf, " def __init__(self, %s, lineno=None):" % self.args
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
109 else:
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
110 print >> buf, " def __init__(self, lineno=None):"
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
111 if self.argnames:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
112 for name in self.argnames:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
113 print >> buf, " self.%s = %s" % (name, name)
33421
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
114 print >> buf, " self.lineno = lineno"
36921
97d38797b8bc NodeInfo.__gen_init(): Fiddle so that reindent.py is
Tim Peters <tim.peters@gmail.com>
parents: 34989
diff changeset
115 # Copy the lines in self.init, indented four spaces. The rstrip()
97d38797b8bc NodeInfo.__gen_init(): Fiddle so that reindent.py is
Tim Peters <tim.peters@gmail.com>
parents: 34989
diff changeset
116 # business is to get rid of the four spaces if line happens to be
97d38797b8bc NodeInfo.__gen_init(): Fiddle so that reindent.py is
Tim Peters <tim.peters@gmail.com>
parents: 34989
diff changeset
117 # empty, so that reindent.py is happy with the output.
97d38797b8bc NodeInfo.__gen_init(): Fiddle so that reindent.py is
Tim Peters <tim.peters@gmail.com>
parents: 34989
diff changeset
118 for line in self.init:
97d38797b8bc NodeInfo.__gen_init(): Fiddle so that reindent.py is
Tim Peters <tim.peters@gmail.com>
parents: 34989
diff changeset
119 print >> buf, (" " + line).rstrip()
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
120
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
121 def _gen_getChildren(self, buf):
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
122 print >> buf, " def getChildren(self):"
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
123 if len(self.argnames) == 0:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
124 print >> buf, " return ()"
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
125 else:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
126 if self.hardest_arg < P_NESTED:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
127 clist = COMMA.join(["self.%s" % c
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
128 for c in self.argnames])
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
129 if self.nargs == 1:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
130 print >> buf, " return %s," % clist
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
131 else:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
132 print >> buf, " return %s" % clist
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
133 else:
33421
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
134 if len(self.argnames) == 1:
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
135 print >> buf, " return tuple(flatten(self.%s))" % self.argnames[0]
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
136 else:
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
137 print >> buf, " children = []"
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
138 template = " children.%s(%sself.%s%s)"
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
139 for name in self.argnames:
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
140 if self.argprops[name] == P_NESTED:
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
141 print >> buf, template % ("extend", "flatten(",
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
142 name, ")")
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
143 else:
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
144 print >> buf, template % ("append", "", name, "")
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
145 print >> buf, " return tuple(children)"
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
146
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
147 def _gen_getChildNodes(self, buf):
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
148 print >> buf, " def getChildNodes(self):"
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
149 if len(self.argnames) == 0:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
150 print >> buf, " return ()"
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
151 else:
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
152 if self.hardest_arg < P_NESTED:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
153 clist = ["self.%s" % c
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
154 for c in self.argnames
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
155 if self.argprops[c] == P_NODE]
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
156 if len(clist) == 0:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
157 print >> buf, " return ()"
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
158 elif len(clist) == 1:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
159 print >> buf, " return %s," % clist[0]
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
160 else:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
161 print >> buf, " return %s" % COMMA.join(clist)
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
162 else:
32888
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
163 print >> buf, " nodelist = []"
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
164 template = " nodelist.%s(%sself.%s%s)"
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
165 for name in self.argnames:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
166 if self.argprops[name] == P_NONE:
33421
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
167 tmp = (" if self.%s is not None:\n"
32888
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
168 " nodelist.append(self.%s)")
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
169 print >> buf, tmp % (name, name)
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
170 elif self.argprops[name] == P_NESTED:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
171 print >> buf, template % ("extend", "flatten_nodes(",
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
172 name, ")")
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
173 elif self.argprops[name] == P_NODE:
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
174 print >> buf, template % ("append", "", name, "")
32888
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
175 print >> buf, " return tuple(nodelist)"
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
176
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
177 def _gen_repr(self, buf):
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
178 print >> buf, " def __repr__(self):"
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
179 if self.argnames:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
180 fmt = COMMA.join(["%s"] * self.nargs)
19362
78dacb543887 Generate correct reprs for Mul, Add, etc.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19255
diff changeset
181 if '(' in self.args:
78dacb543887 Generate correct reprs for Mul, Add, etc.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19255
diff changeset
182 fmt = '(%s)' % fmt
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
183 vals = ["repr(self.%s)" % name for name in self.argnames]
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
184 vals = COMMA.join(vals)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
185 if self.nargs == 1:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
186 vals = vals + ","
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
187 print >> buf, ' return "%s(%s)" %% (%s)' % \
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
188 (self.name, fmt, vals)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
189 else:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
190 print >> buf, ' return "%s()"' % self.name
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
191
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
192 rx_init = re.compile('init\((.*)\):')
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
193
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
194 def parse_spec(file):
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
195 classes = {}
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
196 cur = None
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
197 for line in fileinput.input(file):
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
198 if line.strip().startswith('#'):
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
199 continue
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
200 mo = rx_init.search(line)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
201 if mo is None:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
202 if cur is None:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
203 # a normal entry
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
204 try:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
205 name, args = line.split(':')
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
206 except ValueError:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
207 continue
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
208 classes[name] = NodeInfo(name, args)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
209 cur = None
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
210 else:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
211 # some code for the __init__ method
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
212 cur.init.append(line)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
213 else:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
214 # some extra code for a Node's __init__ method
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
215 name = mo.group(1)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
216 cur = classes[name]
32888
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
217 return sorted(classes.values(), key=lambda n: n.name)
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
218
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
219 def main():
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
220 prologue, epilogue = load_boilerplate(sys.argv[-1])
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
221 print prologue
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
222 print
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
223 classes = parse_spec(SPEC)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
224 for info in classes:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
225 print info.gen_source()
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
226 print epilogue
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
227
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
228 if __name__ == "__main__":
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
229 main()
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
230 sys.exit(0)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
231
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
232 ### PROLOGUE
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
233 """Python abstract syntax node definitions
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
234
33421
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
235 This file is automatically generated by Tools/compiler/astgen.py
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
236 """
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
237 from consts import CO_VARARGS, CO_VARKEYWORDS
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
238
34989
8b05a4732cf3 Fix compiler.ast.flatten function so that it works on lists.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33463
diff changeset
239 def flatten(seq):
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
240 l = []
34989
8b05a4732cf3 Fix compiler.ast.flatten function so that it works on lists.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33463
diff changeset
241 for elt in seq:
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
242 t = type(elt)
33421
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
243 if t is tuple or t is list:
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
244 for elt2 in flatten(elt):
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
245 l.append(elt2)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
246 else:
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
247 l.append(elt)
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
248 return l
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
249
34989
8b05a4732cf3 Fix compiler.ast.flatten function so that it works on lists.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33463
diff changeset
250 def flatten_nodes(seq):
8b05a4732cf3 Fix compiler.ast.flatten function so that it works on lists.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 33463
diff changeset
251 return [n for n in flatten(seq) if isinstance(n, Node)]
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
252
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
253 nodes = {}
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
254
33421
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
255 class Node:
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
256 """Abstract base class for ast nodes."""
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
257 def getChildren(self):
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
258 pass # implemented by subclasses
33421
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
259 def __iter__(self):
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
260 for n in self.getChildren():
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
261 yield n
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
262 def asList(self): # for backwards compatibility
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
263 return self.getChildren()
19248
9f80c70a7a51 Add getChildNodes() method to Node
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15326
diff changeset
264 def getChildNodes(self):
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
265 pass # implemented by subclasses
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
266
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
267 class EmptyNode(Node):
19557
2c2cc31bdf15 Revise implementations of getChildren() and getChildNodes().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19362
diff changeset
268 pass
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
269
32888
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
270 class Expression(Node):
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
271 # Expression is an artificial node class to support "eval"
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
272 nodes["expression"] = "Expression"
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
273 def __init__(self, node):
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
274 self.node = node
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
275
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
276 def getChildren(self):
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
277 return self.node,
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
278
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
279 def getChildNodes(self):
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
280 return self.node,
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
281
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
282 def __repr__(self):
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
283 return "Expression(%s)" % (repr(self.node))
c7e03cf8333e PEP-0318, @decorator-style. In Guido's words:
Anthony Baxter <anthonybaxter@gmail.com>
parents: 32736
diff changeset
284
15326
e5d4c424c44f Support for generation of ast.py from simple description of node
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
285 ### EPILOGUE
33421
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
286 for name, obj in globals().items():
b6e875aa508b compiler.transformer: correct lineno attribute when possible
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32888
diff changeset
287 if isinstance(obj, type) and issubclass(obj, Node):
33463
28ef5fe0b8b5 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33421
diff changeset
288 nodes[name.lower()] = obj