diff options
author | Jeremy Hylton <jeremy@alum.mit.edu> | 2001-04-09 04:28:48 (GMT) |
---|---|---|
committer | Jeremy Hylton <jeremy@alum.mit.edu> | 2001-04-09 04:28:48 (GMT) |
commit | 80e29bd1392bfae865f2ff44b1fe92a5d0fad7c8 (patch) | |
tree | 65c812fe4e6128af147b78daa2ceac73f3ec4b22 /Lib/compiler/future.py | |
parent | 42a083071353f80215715437fdcb6b49cc431169 (diff) | |
download | cpython-80e29bd1392bfae865f2ff44b1fe92a5d0fad7c8.zip cpython-80e29bd1392bfae865f2ff44b1fe92a5d0fad7c8.tar.gz cpython-80e29bd1392bfae865f2ff44b1fe92a5d0fad7c8.tar.bz2 |
Add support for future statements
Diffstat (limited to 'Lib/compiler/future.py')
-rw-r--r-- | Lib/compiler/future.py | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/Lib/compiler/future.py b/Lib/compiler/future.py new file mode 100644 index 0000000..fe25b72 --- /dev/null +++ b/Lib/compiler/future.py @@ -0,0 +1,78 @@ +"""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 + |