[Python-checkins] CVS: python/dist/src/Tools/compiler/compiler future.py,NONE,1.1 pycodegen.py,1.27,1.28

Jeremy Hylton jhylton@users.sourceforge.net
2001年4月08日 21:28:50 -0700


Update of /cvsroot/python/python/dist/src/Tools/compiler/compiler
In directory usw-pr-cvs1:/tmp/cvs-serv2185/compiler
Modified Files:
	pycodegen.py 
Added Files:
	future.py 
Log Message:
Add support for future statements
--- NEW FILE: future.py ---
"""Parser for future statements
"""
from compiler import ast, walk
def is_future(stmt):
 """Return true if statement is a well-formed future statement"""
 if not isinstance(stmt, ast.From):
 return 0
 if stmt.modname == "__future__":
 return 1
 else:
 return 0
class FutureParser:
 features = ("nested_scopes",)
 
 def __init__(self):
 self.found = {} # set
 def visitModule(self, node):
 if node.doc is None:
 off = 0
 else:
 off = 1
 stmt = node.node
 for s in stmt.nodes[off:]:
 if not self.check_stmt(s):
 break
 def check_stmt(self, stmt):
 if is_future(stmt):
 for name, asname in stmt.names:
 if name in self.features:
 self.found[name] = 1
 else:
 raise SyntaxError, \
 "future feature %s is not defined" % name
 stmt.valid_future = 1
 return 1
 return 0
 def get_features(self):
 """Return list of features enabled by future statements"""
 return self.found.keys()
class BadFutureParser:
 """Check for invalid future statements"""
 def visitFrom(self, node):
 if hasattr(node, 'valid_future'):
 return
 if node.modname != "__future__":
 return
 raise SyntaxError, "invalid future statement"
def find_futures(node):
 p1 = FutureParser()
 p2 = BadFutureParser()
 walk(node, p1)
 walk(node, p2)
 return p1.get_features()
if __name__ == "__main__":
 import sys
 from compiler import parseFile, walk
 for file in sys.argv[1:]:
 print file
 tree = parseFile(file)
 v = FutureParser()
 walk(tree, v)
 print v.found
 print
Index: pycodegen.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/compiler/compiler/pycodegen.py,v
retrieving revision 1.27
retrieving revision 1.28
diff -C2 -r1.27 -r1.28
*** pycodegen.py	2000年11月06日 03:43:11	1.27
--- pycodegen.py	2001年04月09日 04:28:48	1.28
***************
*** 10,14 ****
 
 from compiler import ast, parse, walk
! from compiler import pyassem, misc
 from compiler.pyassem import CO_VARARGS, CO_VARKEYWORDS, CO_NEWLOCALS, TupleArg
 
--- 10,14 ----
 
 from compiler import ast, parse, walk
! from compiler import pyassem, misc, future
 from compiler.pyassem import CO_VARARGS, CO_VARKEYWORDS, CO_NEWLOCALS, TupleArg
 
***************
*** 44,54 ****
 
 def compile(self, display=0):
! ast = parse(self.source)
 root, filename = os.path.split(self.filename)
 gen = ModuleCodeGenerator(filename)
! walk(ast, gen, 1)
 if display:
 import pprint
! print pprint.pprint(ast)
 self.code = gen.getCode()
 
--- 44,54 ----
 
 def compile(self, display=0):
! tree = parse(self.source)
 root, filename = os.path.split(self.filename)
 gen = ModuleCodeGenerator(filename)
! walk(tree, gen, 1)
 if display:
 import pprint
! print pprint.pprint(tree)
 self.code = gen.getCode()
 
***************
*** 863,873 ****
 
 class ModuleCodeGenerator(CodeGenerator):
! super_init = CodeGenerator.__init__
 
 def __init__(self, filename):
 # XXX <module> is ? in compile.c
 self.graph = pyassem.PyFlowGraph("<module>", filename)
! self.super_init(filename)
 
 class FunctionCodeGenerator(CodeGenerator):
 super_init = CodeGenerator.__init__
--- 863,885 ----
 
 class ModuleCodeGenerator(CodeGenerator):
! __super_init = CodeGenerator.__init__
! __super_visitModule = CodeGenerator.visitModule
 
 def __init__(self, filename):
 # XXX <module> is ? in compile.c
 self.graph = pyassem.PyFlowGraph("<module>", filename)
! self.__super_init(filename)
! self.symbols = None
! self.future = None
 
+ def visitModule(self, node):
+ self.future = future.find_futures(node)
+ self.symbols = self.parseSymbols(node)
+ self.__super_visitModule(node)
+ 
+ def parseSymbols(self, node):
+ # XXX not implemented
+ return None
+ 
 class FunctionCodeGenerator(CodeGenerator):
 super_init = CodeGenerator.__init__
***************
*** 965,968 ****
--- 977,982 ----
 for name in names:
 self.names.add(name)
+ 
+ # XXX list comprehensions and for loops
 
 def getLocals(self):

AltStyle によって変換されたページ (->オリジナル) /