[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