annotate Lib/compiler/syntax.py @ 80661:94de77bd0b4b 2.7

Issue #16194: document imp.load_dynamic problems when read several extension modules from the same binary object file.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Thu, 29 Nov 2012 19:51:28 +0200
parents 4572fb4dfbb3
children 4cdf21a0dbbc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19939
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1 """Check for errs in the AST.
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
2
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
3 The Python parser does not catch all syntax errors. Others, like
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
4 assignments with invalid targets, are caught in the code generation
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
5 phase.
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
6
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
7 The compiler package catches some errors in the transformer module.
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
8 But it seems clearer to write checkers that use the AST to detect
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
9 errors.
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
10 """
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
11
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
12 from compiler import ast, walk
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
13
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
14 def check(tree, multi=None):
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
15 v = SyntaxErrorChecker(multi)
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
16 walk(tree, v)
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
17 return v.errors
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
18
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
19 class SyntaxErrorChecker:
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
20 """A visitor to find syntax errors in the AST."""
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
21
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
22 def __init__(self, multi=None):
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
23 """Create new visitor object.
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
24
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
25 If optional argument multi is not None, then print messages
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
26 for each error rather than raising a SyntaxError for the
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
27 first.
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
28 """
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
29 self.multi = multi
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
30 self.errors = 0
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
31
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
32 def error(self, node, msg):
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
33 self.errors = self.errors + 1
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
34 if self.multi is not None:
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
35 print "%s:%s: %s" % (node.filename, node.lineno, msg)
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
36 else:
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
37 raise SyntaxError, "%s (%s:%s)" % (msg, node.filename, node.lineno)
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
38
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
39 def visitAssign(self, node):
aaca4d3cf62b Handle more syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
40 # the transformer module handles many of these
35947
4572fb4dfbb3 Stop looping to do nothing, just pass.
Neal Norwitz <nnorwitz@gmail.com>
parents: 19943
diff changeset
41 pass
4572fb4dfbb3 Stop looping to do nothing, just pass.
Neal Norwitz <nnorwitz@gmail.com>
parents: 19943
diff changeset
42 ## for target in node.nodes:
19943
6773dcfe34a3 Last set of change to get regression tests to pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19939
diff changeset
43 ## if isinstance(target, ast.AssList):
6773dcfe34a3 Last set of change to get regression tests to pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19939
diff changeset
44 ## if target.lineno is None:
6773dcfe34a3 Last set of change to get regression tests to pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19939
diff changeset
45 ## target.lineno = node.lineno
6773dcfe34a3 Last set of change to get regression tests to pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19939
diff changeset
46 ## self.error(target, "can't assign to list comprehension")