annotate Lib/lib2to3/pytree.py @ 58765:2ba7677bfa95 legacy-trunk

testCopysign was defined twice in test_math; combine the definitions
author Mark Dickinson <dickinsm@gmail.com>
date Sat, 06 Feb 2010 23:11:25 +0000
parents 94e1b14ec804
children 9fe562a2f0e3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1 # Copyright 2006 Google, Inc. All Rights Reserved.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
2 # Licensed to PSF under a Contributor Agreement.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
3
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
4 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
5 Python parse tree definitions.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
6
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
7 This is a very concrete parse tree; we need to keep every token and
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
8 even the comments and whitespace between tokens.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
9
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
10 There's also a pattern matching implementation here.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
11 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
12
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
13 __author__ = "Guido van Rossum <guido@python.org>"
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
14
49885
0607c97a8124 Merged revisions 67428 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49431
diff changeset
15 import sys
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
16 import warnings
49885
0607c97a8124 Merged revisions 67428 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49431
diff changeset
17 from StringIO import StringIO
0607c97a8124 Merged revisions 67428 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49431
diff changeset
18
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
19
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
20 HUGE = 0x7FFFFFFF # maximum repeat count, default max
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
21
45992
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
22 _type_reprs = {}
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
23 def type_repr(type_num):
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
24 global _type_reprs
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
25 if not _type_reprs:
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
26 from .pygram import python_symbols
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
27 # printing tokens is possible but not as useful
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
28 # from .pgen2 import token // token.__dict__.items():
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
29 for name, val in python_symbols.__dict__.items():
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
30 if type(val) == int: _type_reprs[val] = name
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
31 return _type_reprs.setdefault(type_num, type_num)
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
32
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
33
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
34 class Base(object):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
35
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
36 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
37 Abstract base class for Node and Leaf.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
38
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
39 This provides some default functionality and boilerplate using the
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
40 template pattern.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
41
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
42 A node may be a subnode of at most one parent.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
43 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
44
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
45 # Default values for instance variables
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
46 type = None # int: token number (< 256) or symbol number (>= 256)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
47 parent = None # Parent node pointer, or None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
48 children = () # Tuple of subnodes
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
49 was_changed = False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
50
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
51 def __new__(cls, *args, **kwds):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
52 """Constructor that prevents Base from being instantiated."""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
53 assert cls is not Base, "Cannot instantiate Base"
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
54 return object.__new__(cls)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
55
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
56 def __eq__(self, other):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
57 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
58 Compare two nodes for equality.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
59
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
60 This calls the method _eq().
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
61 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
62 if self.__class__ is not other.__class__:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
63 return NotImplemented
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
64 return self._eq(other)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
65
57074
94e1b14ec804 Merged revisions 74359,75081,75088,75213,75278,75303,75427-75428,75734-75736,75865,76059-76061 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54696
diff changeset
66 __hash__ = None # For Py3 compatibility.
94e1b14ec804 Merged revisions 74359,75081,75088,75213,75278,75303,75427-75428,75734-75736,75865,76059-76061 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54696
diff changeset
67
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
68 def __ne__(self, other):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
69 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
70 Compare two nodes for inequality.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
71
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
72 This calls the method _eq().
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
73 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
74 if self.__class__ is not other.__class__:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
75 return NotImplemented
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
76 return not self._eq(other)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
77
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
78 def _eq(self, other):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
79 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
80 Compare two nodes for equality.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
81
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
82 This is called by __eq__ and __ne__. It is only called if the two nodes
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
83 have the same type. This must be implemented by the concrete subclass.
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
84 Nodes should be considered equal if they have the same structure,
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
85 ignoring the prefix string and other context information.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
86 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
87 raise NotImplementedError
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
88
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
89 def clone(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
90 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
91 Return a cloned (deep) copy of self.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
92
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
93 This must be implemented by the concrete subclass.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
94 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
95 raise NotImplementedError
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
96
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
97 def post_order(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
98 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
99 Return a post-order iterator for the tree.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
100
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
101 This must be implemented by the concrete subclass.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
102 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
103 raise NotImplementedError
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
104
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
105 def pre_order(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
106 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
107 Return a pre-order iterator for the tree.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
108
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
109 This must be implemented by the concrete subclass.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
110 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
111 raise NotImplementedError
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
112
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
113 def set_prefix(self, prefix):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
114 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
115 Set the prefix for the node (see Leaf class).
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
116
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
117 DEPRECATED; use the prefix property directly.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
118 """
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
119 warnings.warn("set_prefix() is deprecated; use the prefix property",
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
120 DeprecationWarning, stacklevel=2)
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
121 self.prefix = prefix
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
122
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
123 def get_prefix(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
124 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
125 Return the prefix for the node (see Leaf class).
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
126
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
127 DEPRECATED; use the prefix property directly.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
128 """
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
129 warnings.warn("get_prefix() is deprecated; use the prefix property",
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
130 DeprecationWarning, stacklevel=2)
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
131 return self.prefix
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
132
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
133 def replace(self, new):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
134 """Replace this node with a new one in the parent."""
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
135 assert self.parent is not None, str(self)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
136 assert new is not None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
137 if not isinstance(new, list):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
138 new = [new]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
139 l_children = []
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
140 found = False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
141 for ch in self.parent.children:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
142 if ch is self:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
143 assert not found, (self.parent.children, self, new)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
144 if new is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
145 l_children.extend(new)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
146 found = True
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
147 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
148 l_children.append(ch)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
149 assert found, (self.children, self, new)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
150 self.parent.changed()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
151 self.parent.children = l_children
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
152 for x in new:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
153 x.parent = self.parent
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
154 self.parent = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
155
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
156 def get_lineno(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
157 """Return the line number which generated the invocant node."""
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
158 node = self
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
159 while not isinstance(node, Leaf):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
160 if not node.children:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
161 return
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
162 node = node.children[0]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
163 return node.lineno
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
164
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
165 def changed(self):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
166 if self.parent:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
167 self.parent.changed()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
168 self.was_changed = True
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
169
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
170 def remove(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
171 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
172 Remove the node from the tree. Returns the position of the node in its
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
173 parent's children before it was removed.
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
174 """
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
175 if self.parent:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
176 for i, node in enumerate(self.parent.children):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
177 if node is self:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
178 self.parent.changed()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
179 del self.parent.children[i]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
180 self.parent = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
181 return i
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
182
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
183 @property
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
184 def next_sibling(self):
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
185 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
186 The node immediately following the invocant in their parent's children
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
187 list. If the invocant does not have a next sibling, it is None
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
188 """
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
189 if self.parent is None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
190 return None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
191
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
192 # Can't use index(); we need to test by identity
46385
842a6c2c9bcd Merged revisions 62080-62262 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45992
diff changeset
193 for i, child in enumerate(self.parent.children):
842a6c2c9bcd Merged revisions 62080-62262 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45992
diff changeset
194 if child is self:
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
195 try:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
196 return self.parent.children[i+1]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
197 except IndexError:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
198 return None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
199
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
200 @property
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
201 def prev_sibling(self):
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
202 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
203 The node immediately preceding the invocant in their parent's children
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
204 list. If the invocant does not have a previous sibling, it is None.
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
205 """
46385
842a6c2c9bcd Merged revisions 62080-62262 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45992
diff changeset
206 if self.parent is None:
842a6c2c9bcd Merged revisions 62080-62262 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45992
diff changeset
207 return None
842a6c2c9bcd Merged revisions 62080-62262 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45992
diff changeset
208
842a6c2c9bcd Merged revisions 62080-62262 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45992
diff changeset
209 # Can't use index(); we need to test by identity
842a6c2c9bcd Merged revisions 62080-62262 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45992
diff changeset
210 for i, child in enumerate(self.parent.children):
842a6c2c9bcd Merged revisions 62080-62262 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45992
diff changeset
211 if child is self:
842a6c2c9bcd Merged revisions 62080-62262 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45992
diff changeset
212 if i == 0:
842a6c2c9bcd Merged revisions 62080-62262 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45992
diff changeset
213 return None
842a6c2c9bcd Merged revisions 62080-62262 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45992
diff changeset
214 return self.parent.children[i-1]
842a6c2c9bcd Merged revisions 62080-62262 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45992
diff changeset
215
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
216 def get_suffix(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
217 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
218 Return the string immediately following the invocant node. This is
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
219 effectively equivalent to node.next_sibling.prefix
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
220 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
221 next_sib = self.next_sibling
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
222 if next_sib is None:
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
223 return u""
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
224 return next_sib.prefix
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
225
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
226 if sys.version_info < (3, 0):
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
227 def __str__(self):
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
228 return unicode(self).encode("ascii")
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
229
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
230
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
231 class Node(Base):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
232
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
233 """Concrete implementation for interior nodes."""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
234
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
235 def __init__(self, type, children, context=None, prefix=None):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
236 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
237 Initializer.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
238
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
239 Takes a type constant (a symbol number >= 256), a sequence of
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
240 child nodes, and an optional context keyword argument.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
241
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
242 As a side effect, the parent pointers of the children are updated.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
243 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
244 assert type >= 256, type
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
245 self.type = type
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
246 self.children = list(children)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
247 for ch in self.children:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
248 assert ch.parent is None, repr(ch)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
249 ch.parent = self
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
250 if prefix is not None:
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
251 self.prefix = prefix
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
252
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
253 def __repr__(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
254 """Return a canonical string representation."""
45992
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
255 return "%s(%s, %r)" % (self.__class__.__name__,
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
256 type_repr(self.type),
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
257 self.children)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
258
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
259 def __unicode__(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
260 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
261 Return a pretty string representation.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
262
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
263 This reproduces the input source exactly.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
264 """
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
265 return u"".join(map(unicode, self.children))
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
266
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
267 if sys.version_info > (3, 0):
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
268 __str__ = __unicode__
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
269
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
270 def _eq(self, other):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
271 """Compare two nodes for equality."""
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
272 return (self.type, self.children) == (other.type, other.children)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
273
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
274 def clone(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
275 """Return a cloned (deep) copy of self."""
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
276 return Node(self.type, [ch.clone() for ch in self.children])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
277
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
278 def post_order(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
279 """Return a post-order iterator for the tree."""
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
280 for child in self.children:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
281 for node in child.post_order():
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
282 yield node
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
283 yield self
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
284
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
285 def pre_order(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
286 """Return a pre-order iterator for the tree."""
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
287 yield self
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
288 for child in self.children:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
289 for node in child.post_order():
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
290 yield node
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
291
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
292 @property
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
293 def prefix(self):
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
294 """
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
295 The whitespace and comments preceding this node in the input.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
296 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
297 if not self.children:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
298 return ""
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
299 return self.children[0].prefix
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
300
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
301 @prefix.setter
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
302 def prefix(self, prefix):
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
303 if self.children:
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
304 self.children[0].prefix = prefix
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
305
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
306 def set_child(self, i, child):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
307 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
308 Equivalent to 'node.children[i] = child'. This method also sets the
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
309 child's parent attribute appropriately.
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
310 """
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
311 child.parent = self
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
312 self.children[i].parent = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
313 self.children[i] = child
50198
21d3357dcbec Merged revisions 67806 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49885
diff changeset
314 self.changed()
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
315
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
316 def insert_child(self, i, child):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
317 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
318 Equivalent to 'node.children.insert(i, child)'. This method also sets
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
319 the child's parent attribute appropriately.
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
320 """
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
321 child.parent = self
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
322 self.children.insert(i, child)
50198
21d3357dcbec Merged revisions 67806 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49885
diff changeset
323 self.changed()
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
324
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
325 def append_child(self, child):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
326 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
327 Equivalent to 'node.children.append(child)'. This method also sets the
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
328 child's parent attribute appropriately.
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
329 """
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
330 child.parent = self
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
331 self.children.append(child)
50198
21d3357dcbec Merged revisions 67806 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49885
diff changeset
332 self.changed()
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
333
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
334
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
335 class Leaf(Base):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
336
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
337 """Concrete implementation for leaf nodes."""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
338
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
339 # Default values for instance variables
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
340 _prefix = "" # Whitespace and comments preceding this token in the input
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
341 lineno = 0 # Line where this token starts in the input
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
342 column = 0 # Column where this token tarts in the input
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
343
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
344 def __init__(self, type, value, context=None, prefix=None):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
345 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
346 Initializer.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
347
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
348 Takes a type constant (a token number < 256), a string value, and an
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
349 optional context keyword argument.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
350 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
351 assert 0 <= type < 256, type
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
352 if context is not None:
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
353 self._prefix, (self.lineno, self.column) = context
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
354 self.type = type
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
355 self.value = value
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
356 if prefix is not None:
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
357 self._prefix = prefix
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
358
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
359 def __repr__(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
360 """Return a canonical string representation."""
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
361 return "%s(%r, %r)" % (self.__class__.__name__,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
362 self.type,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
363 self.value)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
364
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
365 def __unicode__(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
366 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
367 Return a pretty string representation.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
368
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
369 This reproduces the input source exactly.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
370 """
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
371 return self.prefix + unicode(self.value)
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
372
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
373 if sys.version_info > (3, 0):
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
374 __str__ = __unicode__
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
375
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
376 def _eq(self, other):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
377 """Compare two nodes for equality."""
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
378 return (self.type, self.value) == (other.type, other.value)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
379
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
380 def clone(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
381 """Return a cloned (deep) copy of self."""
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
382 return Leaf(self.type, self.value,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
383 (self.prefix, (self.lineno, self.column)))
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
384
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
385 def post_order(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
386 """Return a post-order iterator for the tree."""
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
387 yield self
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
388
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
389 def pre_order(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
390 """Return a pre-order iterator for the tree."""
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
391 yield self
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
392
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
393 @property
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
394 def prefix(self):
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
395 """
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
396 The whitespace and comments preceding this token in the input.
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
397 """
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
398 return self._prefix
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
399
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
400 @prefix.setter
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
401 def prefix(self, prefix):
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
402 self.changed()
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
403 self._prefix = prefix
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
404
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
405
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
406 def convert(gr, raw_node):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
407 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
408 Convert raw node information to a Node or Leaf instance.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
409
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
410 This is passed to the parser driver which calls it whenever a reduction of a
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
411 grammar rule produces a new complete node, so that the tree is build
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
412 strictly bottom-up.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
413 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
414 type, value, context, children = raw_node
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
415 if children or type in gr.number2symbol:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
416 # If there's exactly one child, return that child instead of
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
417 # creating a new node.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
418 if len(children) == 1:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
419 return children[0]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
420 return Node(type, children, context=context)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
421 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
422 return Leaf(type, value, context=context)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
423
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
424
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
425 class BasePattern(object):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
426
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
427 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
428 A pattern is a tree matching pattern.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
429
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
430 It looks for a specific node type (token or symbol), and
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
431 optionally for a specific content.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
432
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
433 This is an abstract base class. There are three concrete
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
434 subclasses:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
435
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
436 - LeafPattern matches a single leaf node;
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
437 - NodePattern matches a single node (usually non-leaf);
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
438 - WildcardPattern matches a sequence of nodes of variable length.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
439 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
440
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
441 # Defaults for instance variables
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
442 type = None # Node type (token if < 256, symbol if >= 256)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
443 content = None # Optional content matching pattern
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
444 name = None # Optional name used to store match in results dict
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
445
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
446 def __new__(cls, *args, **kwds):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
447 """Constructor that prevents BasePattern from being instantiated."""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
448 assert cls is not BasePattern, "Cannot instantiate BasePattern"
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
449 return object.__new__(cls)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
450
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
451 def __repr__(self):
45992
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
452 args = [type_repr(self.type), self.content, self.name]
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
453 while args and args[-1] is None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
454 del args[-1]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
455 return "%s(%s)" % (self.__class__.__name__, ", ".join(map(repr, args)))
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
456
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
457 def optimize(self):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
458 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
459 A subclass can define this as a hook for optimizations.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
460
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
461 Returns either self or another node with the same effect.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
462 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
463 return self
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
464
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
465 def match(self, node, results=None):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
466 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
467 Does this pattern exactly match a node?
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
468
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
469 Returns True if it matches, False if not.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
470
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
471 If results is not None, it must be a dict which will be
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
472 updated with the nodes matching named subpatterns.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
473
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
474 Default implementation for non-wildcard patterns.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
475 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
476 if self.type is not None and node.type != self.type:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
477 return False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
478 if self.content is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
479 r = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
480 if results is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
481 r = {}
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
482 if not self._submatch(node, r):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
483 return False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
484 if r:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
485 results.update(r)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
486 if results is not None and self.name:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
487 results[self.name] = node
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
488 return True
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
489
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
490 def match_seq(self, nodes, results=None):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
491 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
492 Does this pattern exactly match a sequence of nodes?
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
493
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
494 Default implementation for non-wildcard patterns.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
495 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
496 if len(nodes) != 1:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
497 return False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
498 return self.match(nodes[0], results)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
499
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
500 def generate_matches(self, nodes):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
501 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
502 Generator yielding all matches for this pattern.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
503
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
504 Default implementation for non-wildcard patterns.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
505 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
506 r = {}
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
507 if nodes and self.match(nodes[0], r):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
508 yield 1, r
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
509
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
510
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
511 class LeafPattern(BasePattern):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
512
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
513 def __init__(self, type=None, content=None, name=None):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
514 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
515 Initializer. Takes optional type, content, and name.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
516
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
517 The type, if given must be a token type (< 256). If not given,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
518 this matches any *leaf* node; the content may still be required.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
519
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
520 The content, if given, must be a string.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
521
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
522 If a name is given, the matching node is stored in the results
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
523 dict under that key.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
524 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
525 if type is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
526 assert 0 <= type < 256, type
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
527 if content is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
528 assert isinstance(content, basestring), repr(content)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
529 self.type = type
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
530 self.content = content
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
531 self.name = name
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
532
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
533 def match(self, node, results=None):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
534 """Override match() to insist on a leaf node."""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
535 if not isinstance(node, Leaf):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
536 return False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
537 return BasePattern.match(self, node, results)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
538
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
539 def _submatch(self, node, results=None):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
540 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
541 Match the pattern's content to the node's children.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
542
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
543 This assumes the node type matches and self.content is not None.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
544
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
545 Returns True if it matches, False if not.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
546
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
547 If results is not None, it must be a dict which will be
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
548 updated with the nodes matching named subpatterns.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
549
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
550 When returning False, the results dict may still be updated.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
551 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
552 return self.content == node.value
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
553
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
554
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
555 class NodePattern(BasePattern):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
556
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
557 wildcards = False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
558
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
559 def __init__(self, type=None, content=None, name=None):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
560 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
561 Initializer. Takes optional type, content, and name.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
562
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
563 The type, if given, must be a symbol type (>= 256). If the
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
564 type is None this matches *any* single node (leaf or not),
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
565 except if content is not None, in which it only matches
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
566 non-leaf nodes that also match the content pattern.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
567
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
568 The content, if not None, must be a sequence of Patterns that
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
569 must match the node's children exactly. If the content is
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
570 given, the type must not be None.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
571
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
572 If a name is given, the matching node is stored in the results
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
573 dict under that key.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
574 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
575 if type is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
576 assert type >= 256, type
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
577 if content is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
578 assert not isinstance(content, basestring), repr(content)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
579 content = list(content)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
580 for i, item in enumerate(content):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
581 assert isinstance(item, BasePattern), (i, item)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
582 if isinstance(item, WildcardPattern):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
583 self.wildcards = True
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
584 self.type = type
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
585 self.content = content
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
586 self.name = name
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
587
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
588 def _submatch(self, node, results=None):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
589 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
590 Match the pattern's content to the node's children.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
591
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
592 This assumes the node type matches and self.content is not None.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
593
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
594 Returns True if it matches, False if not.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
595
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
596 If results is not None, it must be a dict which will be
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
597 updated with the nodes matching named subpatterns.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
598
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
599 When returning False, the results dict may still be updated.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
600 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
601 if self.wildcards:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
602 for c, r in generate_matches(self.content, node.children):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
603 if c == len(node.children):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
604 if results is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
605 results.update(r)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
606 return True
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
607 return False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
608 if len(self.content) != len(node.children):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
609 return False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
610 for subpattern, child in zip(self.content, node.children):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
611 if not subpattern.match(child, results):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
612 return False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
613 return True
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
614
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
615
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
616 class WildcardPattern(BasePattern):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
617
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
618 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
619 A wildcard pattern can match zero or more nodes.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
620
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
621 This has all the flexibility needed to implement patterns like:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
622
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
623 .* .+ .? .{m,n}
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
624 (a b c | d e | f)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
625 (...)* (...)+ (...)? (...){m,n}
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
626
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
627 except it always uses non-greedy matching.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
628 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
629
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
630 def __init__(self, content=None, min=0, max=HUGE, name=None):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
631 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
632 Initializer.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
633
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
634 Args:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
635 content: optional sequence of subsequences of patterns;
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
636 if absent, matches one node;
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
637 if present, each subsequence is an alternative [*]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
638 min: optinal minumum number of times to match, default 0
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
639 max: optional maximum number of times tro match, default HUGE
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
640 name: optional name assigned to this match
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
641
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
642 [*] Thus, if content is [[a, b, c], [d, e], [f, g, h]] this is
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
643 equivalent to (a b c | d e | f g h); if content is None,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
644 this is equivalent to '.' in regular expression terms.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
645 The min and max parameters work as follows:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
646 min=0, max=maxint: .*
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
647 min=1, max=maxint: .+
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
648 min=0, max=1: .?
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
649 min=1, max=1: .
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
650 If content is not None, replace the dot with the parenthesized
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
651 list of alternatives, e.g. (a b c | d e | f g h)*
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
652 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
653 assert 0 <= min <= max <= HUGE, (min, max)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
654 if content is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
655 content = tuple(map(tuple, content)) # Protect against alterations
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
656 # Check sanity of alternatives
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
657 assert len(content), repr(content) # Can't have zero alternatives
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
658 for alt in content:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
659 assert len(alt), repr(alt) # Can have empty alternatives
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
660 self.content = content
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
661 self.min = min
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
662 self.max = max
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
663 self.name = name
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
664
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
665 def optimize(self):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
666 """Optimize certain stacked wildcard patterns."""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
667 subpattern = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
668 if (self.content is not None and
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
669 len(self.content) == 1 and len(self.content[0]) == 1):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
670 subpattern = self.content[0][0]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
671 if self.min == 1 and self.max == 1:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
672 if self.content is None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
673 return NodePattern(name=self.name)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
674 if subpattern is not None and self.name == subpattern.name:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
675 return subpattern.optimize()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
676 if (self.min <= 1 and isinstance(subpattern, WildcardPattern) and
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
677 subpattern.min <= 1 and self.name == subpattern.name):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
678 return WildcardPattern(subpattern.content,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
679 self.min*subpattern.min,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
680 self.max*subpattern.max,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
681 subpattern.name)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
682 return self
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
683
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
684 def match(self, node, results=None):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
685 """Does this pattern exactly match a node?"""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
686 return self.match_seq([node], results)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
687
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
688 def match_seq(self, nodes, results=None):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
689 """Does this pattern exactly match a sequence of nodes?"""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
690 for c, r in self.generate_matches(nodes):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
691 if c == len(nodes):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
692 if results is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
693 results.update(r)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
694 if self.name:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
695 results[self.name] = list(nodes)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
696 return True
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
697 return False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
698
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
699 def generate_matches(self, nodes):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
700 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
701 Generator yielding matches for a sequence of nodes.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
702
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
703 Args:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
704 nodes: sequence of nodes
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
705
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
706 Yields:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
707 (count, results) tuples where:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
708 count: the match comprises nodes[:count];
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
709 results: dict containing named submatches.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
710 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
711 if self.content is None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
712 # Shortcut for special case (see __init__.__doc__)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
713 for count in xrange(self.min, 1 + min(len(nodes), self.max)):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
714 r = {}
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
715 if self.name:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
716 r[self.name] = nodes[:count]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
717 yield count, r
47997
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
718 elif self.name == "bare_name":
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
719 yield self._bare_name_matches(nodes)
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
720 else:
49885
0607c97a8124 Merged revisions 67428 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49431
diff changeset
721 # The reason for this is that hitting the recursion limit usually
0607c97a8124 Merged revisions 67428 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49431
diff changeset
722 # results in some ugly messages about how RuntimeErrors are being
0607c97a8124 Merged revisions 67428 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49431
diff changeset
723 # ignored.
0607c97a8124 Merged revisions 67428 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49431
diff changeset
724 save_stderr = sys.stderr
0607c97a8124 Merged revisions 67428 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49431
diff changeset
725 sys.stderr = StringIO()
49431
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
726 try:
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
727 for count, r in self._recursive_matches(nodes, 0):
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
728 if self.name:
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
729 r[self.name] = nodes[:count]
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
730 yield count, r
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
731 except RuntimeError:
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
732 # We fall back to the iterative pattern matching scheme if the recursive
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
733 # scheme hits the recursion limit.
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
734 for count, r in self._iterative_matches(nodes):
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
735 if self.name:
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
736 r[self.name] = nodes[:count]
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
737 yield count, r
49885
0607c97a8124 Merged revisions 67428 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49431
diff changeset
738 finally:
0607c97a8124 Merged revisions 67428 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49431
diff changeset
739 sys.stderr = save_stderr
49431
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
740
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
741 def _iterative_matches(self, nodes):
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
742 """Helper to iteratively yield the matches."""
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
743 nodelen = len(nodes)
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
744 if 0 >= self.min:
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
745 yield 0, {}
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
746
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
747 results = []
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
748 # generate matches that use just one alt from self.content
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
749 for alt in self.content:
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
750 for c, r in generate_matches(alt, nodes):
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
751 yield c, r
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
752 results.append((c, r))
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
753
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
754 # for each match, iterate down the nodes
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
755 while results:
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
756 new_results = []
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
757 for c0, r0 in results:
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
758 # stop if the entire set of nodes has been matched
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
759 if c0 < nodelen and c0 <= self.max:
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
760 for alt in self.content:
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
761 for c1, r1 in generate_matches(alt, nodes[c0:]):
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
762 if c1 > 0:
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
763 r = {}
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
764 r.update(r0)
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
765 r.update(r1)
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
766 yield c0 + c1, r
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
767 new_results.append((c0 + c1, r))
2e794757bdc8 Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47997
diff changeset
768 results = new_results
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
769
47997
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
770 def _bare_name_matches(self, nodes):
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
771 """Special optimized matcher for bare_name."""
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
772 count = 0
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
773 r = {}
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
774 done = False
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
775 max = len(nodes)
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
776 while not done and count < max:
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
777 done = True
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
778 for leaf in self.content:
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
779 if leaf[0].match(nodes[count], r):
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
780 count += 1
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
781 done = False
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
782 break
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
783 r[self.name] = nodes[:count]
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
784 return count, r
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
785
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
786 def _recursive_matches(self, nodes, count):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
787 """Helper to recursively yield the matches."""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
788 assert self.content is not None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
789 if count >= self.min:
47997
30fdd0c3b6de Merged revisions 65053-65054 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46385
diff changeset
790 yield 0, {}
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
791 if count < self.max:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
792 for alt in self.content:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
793 for c0, r0 in generate_matches(alt, nodes):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
794 for c1, r1 in self._recursive_matches(nodes[c0:], count+1):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
795 r = {}
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
796 r.update(r0)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
797 r.update(r1)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
798 yield c0 + c1, r
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
799
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
800
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
801 class NegatedPattern(BasePattern):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
802
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
803 def __init__(self, content=None):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
804 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
805 Initializer.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
806
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
807 The argument is either a pattern or None. If it is None, this
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
808 only matches an empty sequence (effectively '$' in regex
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
809 lingo). If it is not None, this matches whenever the argument
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
810 pattern doesn't have any matches.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
811 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
812 if content is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
813 assert isinstance(content, BasePattern), repr(content)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
814 self.content = content
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
815
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
816 def match(self, node):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
817 # We never match a node in its entirety
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
818 return False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
819
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
820 def match_seq(self, nodes):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
821 # We only match an empty sequence of nodes in its entirety
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
822 return len(nodes) == 0
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
823
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
824 def generate_matches(self, nodes):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
825 if self.content is None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
826 # Return a match if there is an empty sequence
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
827 if len(nodes) == 0:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
828 yield 0, {}
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
829 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
830 # Return a match if the argument pattern has no matches
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
831 for c, r in self.content.generate_matches(nodes):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
832 return
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
833 yield 0, {}
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
834
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
835
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
836 def generate_matches(patterns, nodes):
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
837 """
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50198
diff changeset
838 Generator yielding matches for a sequence of patterns and nodes.
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
839
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
840 Args:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
841 patterns: a sequence of patterns
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
842 nodes: a sequence of nodes
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
843
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
844 Yields:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
845 (count, results) tuples where:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
846 count: the entire sequence of patterns matches nodes[:count];
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
847 results: dict containing named submatches.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
848 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
849 if not patterns:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
850 yield 0, {}
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
851 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
852 p, rest = patterns[0], patterns[1:]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
853 for c0, r0 in p.generate_matches(nodes):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
854 if not rest:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
855 yield c0, r0
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
856 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
857 for c1, r1 in generate_matches(rest, nodes[c0:]):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
858 r = {}
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
859 r.update(r0)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
860 r.update(r1)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
861 yield c0 + c1, r