[pypy-svn] r17355 - pypy/dist/pypy/interpreter/astcompiler
adim at codespeak.net
adim at codespeak.net
Thu Sep 8 12:57:42 CEST 2005
Author: adim
Date: Thu Sep 8 12:57:40 2005
New Revision: 17355
Modified:
pypy/dist/pypy/interpreter/astcompiler/ast.py
pypy/dist/pypy/interpreter/astcompiler/ast.txt
pypy/dist/pypy/interpreter/astcompiler/astgen.py
Log:
added ability to add specific methods to ast.py's classes
Modified: pypy/dist/pypy/interpreter/astcompiler/ast.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/ast.py (original)
+++ pypy/dist/pypy/interpreter/astcompiler/ast.py Thu Sep 8 12:57:40 2005
@@ -184,6 +184,19 @@
nodelist.extend(self.nodes)
return nodelist
+ def getArgNames(self):
+ argnames = []
+ for node in self.nodes:
+ if isinstance(node, AssTuple):
+ argnames.extend(node.getArgNames())
+ elif isinstance(node, AssName):
+ name = node.name
+ assert isinstance(name, str)
+ argnames.append(name)
+ else:
+ assert False, "should only have AssName and AssTuple as children"
+ return argnames
+
def __repr__(self):
return "AssTuple(%s)" % (repr(self.nodes),)
Modified: pypy/dist/pypy/interpreter/astcompiler/ast.txt
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/ast.txt (original)
+++ pypy/dist/pypy/interpreter/astcompiler/ast.txt Thu Sep 8 12:57:40 2005
@@ -127,3 +127,16 @@
for test, suite in self.tests:
nodelist.append(test)
nodelist.append(suite)
+
+AssTuple.getArgNames(self):
+ argnames = []
+ for node in self.nodes:
+ if isinstance(node, AssTuple):
+ argnames.extend(node.getArgNames())
+ elif isinstance(node, AssName):
+ name = node.name
+ assert isinstance(name, str)
+ argnames.append(name)
+ else:
+ assert False, "should only have AssName and AssTuple as children"
+ return argnames
Modified: pypy/dist/pypy/interpreter/astcompiler/astgen.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/astgen.py (original)
+++ pypy/dist/pypy/interpreter/astcompiler/astgen.py Thu Sep 8 12:57:40 2005
@@ -51,6 +51,7 @@
self.nargs = len(self.argnames)
self.init = []
self.flatten_nodes = {}
+ self.additional_methods = {}
self.parent = parent
def setup_parent(self, classes):
@@ -110,6 +111,7 @@
print >> buf
self._gen_getChildNodes(buf)
print >> buf
+ self._gen_additional_methods(buf)
self._gen_repr(buf)
print >> buf
self._gen_visit(buf)
@@ -220,12 +222,19 @@
print >> buf, " def accept(self, visitor):"
print >> buf, " return visitor.visit%s(self)" % self.name
+ def _gen_additional_methods(self, buf):
+ for key, value in self.additional_methods.iteritems():
+ if key not in '_cur_':
+ print >> buf, ''.join(value)
+ # print >> buf, '\n\n'
+
def gen_base_visit(self, buf):
print >> buf, " def visit%s(self, node):" % self.name
print >> buf, " return self.default( node )"
rx_init = re.compile('init\((.*)\):')
rx_flatten_nodes = re.compile('flatten_nodes\((.*)\.(.*)\):')
+rx_additional_methods = re.compile('(.*)\.(.*)\((.*?)\):')
def parse_spec(file):
classes = {}
@@ -242,6 +251,10 @@
mo = rx_flatten_nodes.search(line)
if mo:
kind = 'flatten_nodes'
+ else:
+ mo = rx_additional_methods.search(line)
+ if mo:
+ kind = 'additional_method'
if mo is None:
if cur is None:
if comment:
@@ -263,6 +276,8 @@
cur.init.append(line)
elif kind == 'flatten_nodes':
cur.flatten_nodes['_cur_'].append(line)
+ elif kind == 'additional_method':
+ cur.additional_methods['_cur_'].append(' '*4 + line)
elif kind == 'init':
# some extra code for a Node's __init__ method
name = mo.group(1)
@@ -273,6 +288,13 @@
attr = mo.group(2)
cur = classes[name]
cur.flatten_nodes[attr] = cur.flatten_nodes['_cur_'] = []
+ elif kind == 'additional_method':
+ name = mo.group(1)
+ methname = mo.group(2)
+ params = mo.group(3)
+ cur = classes[name]
+ cur.additional_methods['_cur_'] = [' def %s(%s):\n' % (methname, params)]
+ cur.additional_methods[methname] = cur.additional_methods['_cur_']
for node in classes.values():
node.setup_parent(classes)
More information about the Pypy-commit
mailing list