Browse Source

BUGFIX: iter_trees() wasn't consistent with a recursive order (Issue #47)

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.5.1
Erez Shinan 6 years ago
parent
commit
cb18cf5e77
1 changed files with 12 additions and 3 deletions
  1. +12
    -3
      lark/tree.py

+ 12
- 3
lark/tree.py View File

@@ -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)


Loading…
Cancel
Save