| @@ -67,17 +67,26 @@ class Tree(object): | |||||
| yield c | yield c | ||||
| def iter_subtrees(self): | def iter_subtrees(self): | ||||
| # TODO: Re-write as a more efficient version | |||||
| visited = set() | visited = set() | ||||
| q = [self] | q = [self] | ||||
| l = [] | |||||
| while q: | while q: | ||||
| subtree = q.pop() | subtree = q.pop() | ||||
| l.append( subtree ) | |||||
| if id(subtree) in visited: | if id(subtree) in visited: | ||||
| continue # already been here from another branch | continue # already been here from another branch | ||||
| visited.add(id(subtree)) | visited.add(id(subtree)) | ||||
| yield subtree | |||||
| q += [c for c in subtree.children if isinstance(c, Tree)] | q += [c for c in subtree.children if isinstance(c, Tree)] | ||||
| seen = set() | |||||
| for x in reversed(l): | |||||
| if id(x) not in seen: | |||||
| yield x | |||||
| seen.add(id(x)) | |||||
| def __deepcopy__(self, memo): | def __deepcopy__(self, memo): | ||||
| return type(self)(self.data, deepcopy(self.children, memo)) | return type(self)(self.data, deepcopy(self.children, memo)) | ||||
| @@ -147,7 +156,7 @@ class Visitor_NoRecurse(Visitor): | |||||
| def visit(self, tree): | def visit(self, tree): | ||||
| subtrees = list(tree.iter_subtrees()) | subtrees = list(tree.iter_subtrees()) | ||||
| for subtree in reversed(subtrees): | |||||
| for subtree in (subtrees): | |||||
| getattr(self, subtree.data, self.__default__)(subtree) | getattr(self, subtree.data, self.__default__)(subtree) | ||||
| return tree | return tree | ||||
| @@ -165,7 +174,7 @@ class Transformer_NoRecurse(Transformer): | |||||
| else: | else: | ||||
| return f(t) | return f(t) | ||||
| for subtree in reversed(subtrees): | |||||
| for subtree in (subtrees): | |||||
| subtree.children = [_t(c) if isinstance(c, Tree) else c for c in subtree.children] | subtree.children = [_t(c) if isinstance(c, Tree) else c for c in subtree.children] | ||||
| return _t(tree) | return _t(tree) | ||||