Mercurial > cpython-lru_cache-weakref
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 |
| 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 |
