[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