[pypy-svn] r20960 - in pypy/dist/pypy: interpreter/astcompiler interpreter/pyparser interpreter/stablecompiler module/symbol

ludal at codespeak.net ludal at codespeak.net
Fri Dec 9 18:27:27 CET 2005


Author: ludal
Date: Fri Dec  9 18:27:24 2005
New Revision: 20960

Modified:
   pypy/dist/pypy/interpreter/astcompiler/__init__.py
   pypy/dist/pypy/interpreter/astcompiler/pycodegen.py
   pypy/dist/pypy/interpreter/astcompiler/symbols.py
   pypy/dist/pypy/interpreter/pyparser/astbuilder.py
   pypy/dist/pypy/interpreter/pyparser/ebnfparse.py
   pypy/dist/pypy/interpreter/pyparser/pysymbol.py
   pypy/dist/pypy/interpreter/pyparser/pythonparse.py
   pypy/dist/pypy/interpreter/pyparser/syntaxtree.py
   pypy/dist/pypy/interpreter/stablecompiler/transformer.py
   pypy/dist/pypy/module/symbol/__init__.py
Log:
more refactoring towards making the grammar parser
annotatable


Modified: pypy/dist/pypy/interpreter/astcompiler/__init__.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/__init__.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/__init__.py	Fri Dec  9 18:27:24 2005
@@ -21,6 +21,6 @@
     Generates a .pyc file by compiling filename.
 """
 
-from transformer import parse, parseFile
-from visitor import walk
-from pycodegen import compile, compileFile
+# from transformer import parse, parseFile
+# from visitor import walk
+# from pycodegen import compile, compileFile

Modified: pypy/dist/pypy/interpreter/astcompiler/pycodegen.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/pycodegen.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/pycodegen.py	Fri Dec  9 18:27:24 2005
@@ -4,7 +4,8 @@
 import struct
 import sys
 
-from pypy.interpreter.astcompiler import ast, parse, walk, syntax
+#from pypy.interpreter.astcompiler import ast, parse, walk, syntax
+from pypy.interpreter.astcompiler import ast
 from pypy.interpreter.astcompiler import pyassem, misc, future, symbols
 from pypy.interpreter.astcompiler.consts import SC_LOCAL, SC_GLOBAL, \
     SC_FREE, SC_CELL, SC_DEFAULT, OP_APPLY, OP_ASSIGN, OP_DELETE, OP_NONE
@@ -350,7 +351,7 @@
         gen = FunctionCodeGenerator(self.space, node, isLambda,
                                self.class_name, self.get_module(),
                                     self.scopeambiguity)
-        walk(node.code, gen)
+        node.code.accept( gen )
         gen.finish()
         self.set_lineno(node)
         for default in node.defaults:
@@ -374,7 +375,7 @@
         gen = ClassCodeGenerator(self.space, node,
                                  self.get_module(),
                                  self.scopeambiguity)
-        walk(node.code, gen)
+        node.code.accept( gen )
         gen.finish()
         self.set_lineno(node)
         self.emitop_obj('LOAD_CONST', self.space.wrap(node.name) )
@@ -620,7 +621,7 @@
                                    self.get_module(), self.scopeambiguity)
         inner = node.code
         assert isinstance(inner, ast.GenExprInner)
-        walk(inner, gen)
+        inner.accept( gen )
         gen.finish()
         self.set_lineno(node)
         frees = gen.scope.get_free_vars()
@@ -1378,7 +1379,6 @@
 def findOp(node):
     """Find the op (DELETE, LOAD, STORE) in an AssTuple tree"""
     v = OpFinder()
-    # walk(node, v, verbose=0)
     node.accept(v)
     return v.op
 

Modified: pypy/dist/pypy/interpreter/astcompiler/symbols.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/symbols.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/symbols.py	Fri Dec  9 18:27:24 2005
@@ -516,7 +516,7 @@
     
 if __name__ == "__main__":
     import sys
-    from pypy.interpreter.astcompiler import parseFile, walk
+    from pypy.interpreter.astcompiler import parseFile
     import symtable
 
     def get_names(syms):
@@ -532,7 +532,7 @@
         mod_names = get_names(syms)
         tree = parseFile(file)
         s = SymbolVisitor()
-        walk(tree, s)
+        tree.accept(s)
 
         # compare module-level symbols
         names2 = tree.scope.get_names()

Modified: pypy/dist/pypy/interpreter/pyparser/astbuilder.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/astbuilder.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/astbuilder.py	Fri Dec  9 18:27:24 2005
@@ -5,7 +5,7 @@
 
 from grammar import BaseGrammarBuilder, AbstractContext
 from pypy.interpreter.astcompiler import ast, consts
-import pypy.interpreter.pyparser.pysymbol as sym
+from pypy.interpreter.pyparser.pysymbol import _cpython_symbols as sym
 import pypy.interpreter.pyparser.pytoken as tok
 from pypy.interpreter.pyparser.error import SyntaxError
 from pypy.interpreter.pyparser.parsestring import parsestr
@@ -1442,55 +1442,55 @@
 
 
 ASTRULES = {
-    sym.atom : build_atom,
-    sym.power : build_power,
-    sym.factor : build_factor,
-    sym.term : build_term,
-    sym.arith_expr : build_arith_expr,
-    sym.shift_expr : build_shift_expr,
-    sym.and_expr : build_and_expr,
-    sym.xor_expr : build_xor_expr,
-    sym.expr : build_expr,
-    sym.comparison : build_comparison,
-    sym.comp_op : build_comp_op,
-    sym.and_test : build_and_test,
-    sym.not_test : build_not_test,
-    sym.test : build_test,
-    sym.testlist : build_testlist,
-    sym.expr_stmt : build_expr_stmt,
-    sym.small_stmt : return_one,
-    sym.simple_stmt : build_simple_stmt,
-    sym.single_input : build_single_input,
-    sym.file_input : build_file_input,
-    sym.testlist_gexp : build_testlist_gexp,
-    sym.lambdef : build_lambdef,
-    sym.trailer : build_trailer,
-    sym.arglist : build_arglist,
-    sym.subscript : build_subscript,
-    sym.listmaker : build_listmaker,
-    sym.funcdef : build_funcdef,
-    sym.classdef : build_classdef,
-    sym.return_stmt : build_return_stmt,
-    sym.suite : build_suite,
-    sym.if_stmt : build_if_stmt,
-    sym.pass_stmt : build_pass_stmt,
-    sym.break_stmt : build_break_stmt,
-    sym.for_stmt : build_for_stmt,
-    sym.while_stmt : build_while_stmt,
-    sym.import_name : build_import_name,
-    sym.import_from : build_import_from,
-    sym.yield_stmt : build_yield_stmt,
-    sym.continue_stmt : build_continue_stmt,
-    sym.del_stmt : build_del_stmt,
-    sym.assert_stmt : build_assert_stmt,
-    sym.exec_stmt : build_exec_stmt,
-    sym.print_stmt : build_print_stmt,
-    sym.global_stmt : build_global_stmt,
-    sym.raise_stmt : build_raise_stmt,
-    sym.try_stmt : build_try_stmt,
-    sym.exprlist : build_exprlist,
-    sym.decorator : build_decorator,
-    sym.eval_input : build_eval_input,
+    sym['atom'] : build_atom,
+    sym['power'] : build_power,
+    sym['factor'] : build_factor,
+    sym['term'] : build_term,
+    sym['arith_expr'] : build_arith_expr,
+    sym['shift_expr'] : build_shift_expr,
+    sym['and_expr'] : build_and_expr,
+    sym['xor_expr'] : build_xor_expr,
+    sym['expr'] : build_expr,
+    sym['comparison'] : build_comparison,
+    sym['comp_op'] : build_comp_op,
+    sym['and_test'] : build_and_test,
+    sym['not_test'] : build_not_test,
+    sym['test'] : build_test,
+    sym['testlist'] : build_testlist,
+    sym['expr_stmt'] : build_expr_stmt,
+    sym['small_stmt'] : return_one,
+    sym['simple_stmt'] : build_simple_stmt,
+    sym['single_input'] : build_single_input,
+    sym['file_input'] : build_file_input,
+    sym['testlist_gexp'] : build_testlist_gexp,
+    sym['lambdef'] : build_lambdef,
+    sym['trailer'] : build_trailer,
+    sym['arglist'] : build_arglist,
+    sym['subscript'] : build_subscript,
+    sym['listmaker'] : build_listmaker,
+    sym['funcdef'] : build_funcdef,
+    sym['classdef'] : build_classdef,
+    sym['return_stmt'] : build_return_stmt,
+    sym['suite'] : build_suite,
+    sym['if_stmt'] : build_if_stmt,
+    sym['pass_stmt'] : build_pass_stmt,
+    sym['break_stmt'] : build_break_stmt,
+    sym['for_stmt'] : build_for_stmt,
+    sym['while_stmt'] : build_while_stmt,
+    sym['import_name'] : build_import_name,
+    sym['import_from'] : build_import_from,
+    sym['yield_stmt'] : build_yield_stmt,
+    sym['continue_stmt'] : build_continue_stmt,
+    sym['del_stmt'] : build_del_stmt,
+    sym['assert_stmt'] : build_assert_stmt,
+    sym['exec_stmt'] : build_exec_stmt,
+    sym['print_stmt'] : build_print_stmt,
+    sym['global_stmt'] : build_global_stmt,
+    sym['raise_stmt'] : build_raise_stmt,
+    sym['try_stmt'] : build_try_stmt,
+    sym['exprlist'] : build_exprlist,
+    sym['decorator'] : build_decorator,
+    sym['eval_input'] : build_eval_input,
     }
 
 ## Stack elements definitions ###################################

Modified: pypy/dist/pypy/interpreter/pyparser/ebnfparse.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/ebnfparse.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/ebnfparse.py	Fri Dec  9 18:27:24 2005
@@ -2,6 +2,7 @@
 from grammar import BaseGrammarBuilder, Alternative, Sequence, Token, \
      KleeneStar, GrammarElement, build_first_sets, EmptyToken
 from ebnflexer import GrammarSource
+import ebnfgrammar
 from ebnfgrammar import GRAMMAR_GRAMMAR, sym_map
 from syntaxtree import AbstractSyntaxVisitor
 import pytoken
@@ -66,6 +67,116 @@
         return True
 
 
+
+def ebnf_handle_grammar(self, node):
+    for rule in node.nodes:
+	rule.visit(self)
+    # the rules are registered already
+    # we do a pass through the variables to detect
+    # terminal symbols from non terminals
+    for r in self.items:
+	for i,a in enumerate(r.args):
+	    if a.codename in self.rules:
+		assert isinstance(a,Token)
+		r.args[i] = self.rules[a.codename]
+		if a.codename in self.terminals:
+		    del self.terminals[a.codename]
+    # XXX .keywords also contains punctuations
+    self.terminals['NAME'].keywords = self.keywords
+
+def ebnf_handle_rule(self, node):
+    symdef = node.nodes[0].value
+    self.current_rule = symdef
+    self.current_subrule = 0
+    alt = node.nodes[1]
+    rule = alt.visit(self)
+    if not isinstance(rule, Token):
+	rule.codename = self.symbols.add_symbol( symdef )
+    self.rules[rule.codename] = rule
+
+def ebnf_handle_alternative(self, node):
+    items = [node.nodes[0].visit(self)]
+    items += node.nodes[1].visit(self)        
+    if len(items) == 1 and not items[0].is_root():
+	return items[0]
+    alt = Alternative(self.new_symbol(), items)
+    return self.new_item(alt)
+
+def ebnf_handle_sequence( self, node ):
+    """ """
+    items = []
+    for n in node.nodes:
+	items.append( n.visit(self) )
+    if len(items)==1:
+	return items[0]
+    elif len(items)>1:
+	return self.new_item( Sequence( self.new_symbol(), items) )
+    raise RuntimeError("Found empty sequence")
+
+def ebnf_handle_sequence_cont( self, node ):
+    """Returns a list of sequences (possibly empty)"""
+    return [n.visit(self) for n in node.nodes]
+
+def ebnf_handle_seq_cont_list(self, node):
+    return node.nodes[1].visit(self)
+
+
+def ebnf_handle_symbol(self, node):
+    star_opt = node.nodes[1]
+    sym = node.nodes[0].value
+    terminal = self.terminals.get( sym, None )
+    if not terminal:
+	tokencode = pytoken.tok_values.get( sym, None )
+	if tokencode is None:
+	    tokencode = self.symbols.add_symbol( sym )
+	    terminal = Token( tokencode )
+	else:
+	    terminal = Token( tokencode )
+	    self.terminals[sym] = terminal
+
+    return self.repeat( star_opt, terminal )
+
+def ebnf_handle_option( self, node ):
+    rule = node.nodes[1].visit(self)
+    return self.new_item( KleeneStar( self.new_symbol(), 0, 1, rule ) )
+
+def ebnf_handle_group( self, node ):
+    rule = node.nodes[1].visit(self)
+    return self.repeat( node.nodes[3], rule )
+
+def ebnf_handle_TOK_STRING( self, node ):
+    value = node.value
+    tokencode = pytoken.tok_punct.get( value, None )
+    if tokencode is None:
+	if not py_name.match( value ):
+	    raise RuntimeError("Unknown STRING value ('%s')" % value )
+	# assume a keyword
+	tok = Token( pytoken.NAME, value )
+	if value not in self.keywords:
+	    self.keywords.append( value )
+    else:
+	# punctuation
+	tok = Token( tokencode )
+    return tok
+
+def ebnf_handle_sequence_alt( self, node ):
+    res = node.nodes[0].visit(self)
+    assert isinstance( res, GrammarElement )
+    return res
+
+# This will setup a mapping between
+# ebnf_handle_xxx functions and ebnfgrammar.xxx
+ebnf_handles = {}
+for name, value in globals().items():
+    if name.startswith("ebnf_handle_"):
+	name = name[12:]
+	key = getattr(ebnfgrammar, name )
+	ebnf_handles[key] = value
+
+def handle_unknown( self, node ):
+    raise RuntimeError("Unknown Visitor for %r" % node.name)
+    
+
 class EBNFVisitor(AbstractSyntaxVisitor):
     
     def __init__(self):
@@ -76,11 +187,12 @@
         self.keywords = []
         self.items = []
         self.terminals['NAME'] = NameToken()
+        self.symbols = pysymbol.SymbolMapper( pysymbol._cpython_symbols.sym_name )
 
     def new_symbol(self):
         rule_name = ":%s_%s" % (self.current_rule, self.current_subrule)
         self.current_subrule += 1
-        symval = pysymbol.add_anon_symbol( rule_name )
+        symval = self.symbols.add_anon_symbol( rule_name )
         return symval
 
     def new_item(self, itm):
@@ -88,17 +200,8 @@
         return itm
 
     def visit_syntaxnode( self, node ):
-        """NOT RPYTHON, used only at bootstrap time anyway"""
-        name = sym_map[node.name]
-        visit_meth = getattr(self, "handle_%s" % name, None)
-        if visit_meth:
-            return visit_meth(node)
-        else:
-            print "Unknown handler for %s" %name
-        # helper function for nodes that have only one subnode:
-        if len(node.nodes) == 1:
-            return node.nodes[0].visit(visitor)
-        raise RuntimeError("Unknown Visitor for %r" % name)
+	visit_func = ebnf_handles.get( node.name, handle_unknown )
+	return visit_func( self, node )
 
     def visit_tokennode( self, node ):
         return self.visit_syntaxnode( node )
@@ -106,101 +209,6 @@
     def visit_tempsyntaxnode( self, node ):
         return self.visit_syntaxnode( node )
 
-    def handle_grammar(self, node):
-        for rule in node.nodes:
-            rule.visit(self)
-        # the rules are registered already
-        # we do a pass through the variables to detect
-        # terminal symbols from non terminals
-        for r in self.items:
-            for i,a in enumerate(r.args):
-                if a.codename in self.rules:
-                    assert isinstance(a,Token)
-                    r.args[i] = self.rules[a.codename]
-                    if a.codename in self.terminals:
-                        del self.terminals[a.codename]
-        # XXX .keywords also contains punctuations
-        self.terminals['NAME'].keywords = self.keywords
-
-    def handle_rule(self, node):
-        symdef = node.nodes[0].value
-        self.current_rule = symdef
-        self.current_subrule = 0
-        alt = node.nodes[1]
-        rule = alt.visit(self)
-        if not isinstance(rule, Token):
-            rule.codename = pysymbol.add_symbol( symdef )
-        self.rules[rule.codename] = rule
-        
-    def handle_alternative(self, node):
-        items = [node.nodes[0].visit(self)]
-        items += node.nodes[1].visit(self)        
-        if len(items) == 1 and not items[0].is_root():
-            return items[0]
-        alt = Alternative(self.new_symbol(), items)
-        return self.new_item(alt)
-
-    def handle_sequence( self, node ):
-        """ """
-        items = []
-        for n in node.nodes:
-            items.append( n.visit(self) )
-        if len(items)==1:
-            return items[0]
-        elif len(items)>1:
-            return self.new_item( Sequence( self.new_symbol(), items) )
-        raise SyntaxError("Found empty sequence")
-
-    def handle_sequence_cont( self, node ):
-        """Returns a list of sequences (possibly empty)"""
-        return [n.visit(self) for n in node.nodes]
-
-    def handle_seq_cont_list(self, node):
-        return node.nodes[1].visit(self)
-    
-
-    def handle_symbol(self, node):
-        star_opt = node.nodes[1]
-        sym = node.nodes[0].value
-        terminal = self.terminals.get( sym )
-        if not terminal:
-            tokencode = pytoken.tok_values.get( sym )
-            if tokencode is None:
-                tokencode = pysymbol.add_symbol( sym )
-                terminal = Token( tokencode )
-            else:
-                terminal = Token( tokencode )
-                self.terminals[sym] = terminal
-
-        return self.repeat( star_opt, terminal )
-
-    def handle_option( self, node ):
-        rule = node.nodes[1].visit(self)
-        return self.new_item( KleeneStar( self.new_symbol(), 0, 1, rule ) )
-
-    def handle_group( self, node ):
-        rule = node.nodes[1].visit(self)
-        return self.repeat( node.nodes[3], rule )
-
-    def handle_TOK_STRING( self, node ):
-        value = node.value
-        tokencode = pytoken.tok_punct.get( value )
-        if tokencode is None:
-            if not py_name.match( value ):
-                raise SyntaxError("Unknown STRING value ('%s')" % value )
-            # assume a keyword
-            tok = Token( pytoken.NAME, value )
-            if value not in self.keywords:
-                self.keywords.append( value )
-        else:
-            # punctuation
-            tok = Token( tokencode )
-        return tok
-
-    def handle_sequence_alt( self, node ):
-        res = node.nodes[0].visit(self)
-        assert isinstance( res, GrammarElement )
-        return res
 
     def repeat( self, star_opt, myrule ):
         assert isinstance( myrule, GrammarElement )
@@ -214,7 +222,7 @@
                 item = KleeneStar(rule_name, _min=0, rule=myrule)
                 return self.new_item(item)
             else:
-                raise SyntaxError("Got symbol star_opt with value='%s'"
+                raise RuntimeError("Got symbol star_opt with value='%s'"
                                   % tok.value)
         return myrule
 
@@ -245,7 +253,10 @@
     vis = EBNFVisitor()
     node.visit(vis)
     return vis
-    
+
+def target_parse_grammar_text(txt):
+    vis = parse_grammar_text(txt)
+    # do nothing
 
 from pprint import pprint
 if __name__ == "__main__":

Modified: pypy/dist/pypy/interpreter/pyparser/pysymbol.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/pysymbol.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/pysymbol.py	Fri Dec  9 18:27:24 2005
@@ -9,48 +9,63 @@
 # it's important for CPython, but I'm not so sure it's still
 # important here
 
-_anoncount = -10
-_count = 0
+class SymbolMapper(object):
+    def __init__(self, sym_name=None ):
+        _anoncount = self._anoncount = -10
+        _count = self._count = 0
+        self.sym_name = {}
+        self.sym_values = {}
+        if sym_name is not None:
+            for _value, _name in sym_name.items():
+                if _value<_anoncount:
+                    _anoncount = _value
+                if _value>_count:
+                    _count = _value
+                self.sym_values[_name] = _value
+                self.sym_name[_value] = _name
+            self._anoncount = _anoncount
+            self._count = _count
+
+    def add_symbol( self, sym ):
+        assert type(sym)==str
+        if not sym in self.sym_values:
+            self._count += 1
+            val = self._count
+            self.sym_values[sym] = val
+            self.sym_name[val] = sym
+            return val
+        return self.sym_values[ sym ]
+
+    def add_anon_symbol( self, sym ):
+        assert type(sym)==str
+        if not sym in self.sym_values:
+            self._anoncount -= 1
+            val = self._anoncount
+            self.sym_values[sym] = val
+            self.sym_name[val] = sym
+            return val
+        return self.sym_values[ sym ]
+
+    def __getitem__(self, sym ):
+        """NOT RPYTHON"""
+        assert type(sym)==str
+        return self.sym_values[ sym ]
+    
+
+_cpython_symbols = SymbolMapper( symbol.sym_name )
+
 
-sym_name = {}
-sym_values = {}
+# prepopulate symbol table from symbols used by CPython
+for _value, _name in _cpython_symbols.sym_name.items():
+    globals()[_name] = _value
 
-for _name, _value in symbol.__dict__.items():
-    if type(_value) is type(0):
-        _count = max(_count, _value)
-
-def add_symbol( sym ):
-    assert type(sym)==str
-    if not sym_values.has_key( sym ):
-        if hasattr(symbol, sym):
-            val = getattr(symbol, sym)
-        else:
-            global _count
-            _count += 1
-            val = _count
-        sym_values[sym] = val
-        sym_name[val] = sym
-        globals()[sym] = val
-        return val
-    return sym_values[ sym ]
-
-def add_anon_symbol( sym ):
-    global _anoncount
-    assert type(sym)==str
-    if not sym_values.has_key( sym ):
-        val = _anoncount
-        sym_values[sym] = val
-        sym_name[val] = sym
-        _anoncount -= 1
-        return val
-    return sym_values[ sym ]
     
 
 def update_symbols( parser ):
     """Update the symbol module according to rules
     in PythonParser instance : parser"""
     for rule in parser.rules:
-        add_symbol( rule )
+        _cpython_symbols.add_symbol( rule )
 
 # There is no symbol in this module until the grammar is loaded
 # once loaded the grammar parser will fill the mappings with the

Modified: pypy/dist/pypy/interpreter/pyparser/pythonparse.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/pythonparse.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/pythonparse.py	Fri Dec  9 18:27:24 2005
@@ -45,7 +45,7 @@
         return self.parse_lines(lines, goal, builder, flags)
 
     def parse_lines(self, lines, goal, builder, flags=0):
-        goalnumber = pysymbol.sym_values[goal]
+        goalnumber = pysymbol._cpython_symbols.sym_values[goal]
         target = self.rules[goalnumber]
         src = Source(lines, flags)
     
@@ -153,3 +153,8 @@
 
 def grammar_rules( space ):
     return space.wrap( PYTHON_PARSER.rules )
+
+
+def make_rule( space, w_rule ):
+    rule = space.str_w( w_rule )
+    

Modified: pypy/dist/pypy/interpreter/pyparser/syntaxtree.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/syntaxtree.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/syntaxtree.py	Fri Dec  9 18:27:24 2005
@@ -1,10 +1,10 @@
 """SyntaxTree class definition"""
-try:
-    from pypy.interpreter.pyparser.pysymbol import sym_values
-    from pypy.interpreter.pyparser.pytoken import tok_values
-except ImportError:
-    from pysymbol import sym_values
-    from pytoken import tok_values
+# try:
+# #    from pypy.interpreter.pyparser.pysymbol import sym_values
+#     from pypy.interpreter.pyparser.pytoken import tok_values
+# except ImportError:
+# #    from pysymbol import sym_values
+#     from pytoken import tok_values
     
 class AbstractSyntaxVisitor(object):
     def visit_syntaxnode( self, node ):
@@ -60,11 +60,13 @@
         a TempSyntaxNode"""
         return [ self ]
 
-    def totuple(self, lineno=False ):
-        """returns a tuple representation of the syntax tree"""
+    def totuple(self, sym_values, lineno=False ):
+        """returns a tuple representation of the syntax tree
+        needs symbols+tokens value to name mapping to represent the nodes
+        """
         symvalue = sym_values.get( self.name, (0, self.name) )
         l = [ symvalue ]
-        l += [node.totuple(lineno) for node in self.nodes]
+        l += [node.totuple(lineno, sym_values ) for node in self.nodes]
         return tuple(l)
     
 
@@ -102,8 +104,10 @@
         assert isinstance(visitor, AbstractSyntaxVisitor) 
         return visitor.visit_tokennode(self)
 
-    def totuple(self, lineno=False):
-        """returns a tuple representation of the syntax tree"""
+    def totuple(self, tok_values, lineno=False):
+        """returns a tuple representation of the syntax tree
+        needs symbols+tokens value to name mapping to represent the nodes
+        """
         num = tok_values.get(self.name, -1)
         if num == -1:
             print "Unknown", self.name, self.value

Modified: pypy/dist/pypy/interpreter/stablecompiler/transformer.py
==============================================================================
--- pypy/dist/pypy/interpreter/stablecompiler/transformer.py	(original)
+++ pypy/dist/pypy/interpreter/stablecompiler/transformer.py	Fri Dec  9 18:27:24 2005
@@ -33,6 +33,8 @@
 import pypy.interpreter.pyparser.pytoken as token
 import sys
 
+sym_name = symbol._cpython_symbols.sym_name
+
 # transforming is requiring a lot of recursion depth so make sure we have enough
 if sys.getrecursionlimit()<5000:
     sys.setrecursionlimit(5000)
@@ -113,7 +115,7 @@
     def __init__(self, filename=''):
         self._dispatch = {}
         self.filename = filename
-        for value, name in symbol.sym_name.items():
+        for value, name in sym_name.items():
             if hasattr(self, name):
                 self._dispatch[value] = getattr(self, name)
         self._dispatch[token.NEWLINE] = self.com_NEWLINE
@@ -1481,7 +1483,7 @@
 
 import types
 _names = {}
-for k, v in symbol.sym_name.items():
+for k, v in sym_name.items():
     _names[k] = v
 for k, v in token.tok_name.items():
     _names[k] = v

Modified: pypy/dist/pypy/module/symbol/__init__.py
==============================================================================
--- pypy/dist/pypy/module/symbol/__init__.py	(original)
+++ pypy/dist/pypy/module/symbol/__init__.py	Fri Dec  9 18:27:24 2005
@@ -24,7 +24,7 @@
 from pypy.interpreter.pyparser import pysymbol
 
 sym_name = {}
-for val, name in pysymbol.sym_name.items():
+for val, name in pysymbol._cpython_symbols.sym_name.items():
     if val >= 0:
         Module.interpleveldefs[name] = 'space.wrap(%d)' % val
         sym_name[val] = name



More information about the Pypy-commit mailing list