Переглянути джерело

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 роки тому
джерело
коміт
cb18cf5e77
1 змінених файлів з 12 додано та 3 видалено
  1. +12
    -3
      lark/tree.py

+ 12
- 3
lark/tree.py Переглянути файл

@@ -67,17 +67,26 @@ class Tree(object):
yield c

def iter_subtrees(self):
# TODO: Re-write as a more efficient version

visited = set()
q = [self]

l = []
while q:
subtree = q.pop()
l.append( subtree )
if id(subtree) in visited:
continue # already been here from another branch
visited.add(id(subtree))
yield subtree
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):
return type(self)(self.data, deepcopy(self.children, memo))
@@ -147,7 +156,7 @@ class Visitor_NoRecurse(Visitor):
def visit(self, tree):
subtrees = list(tree.iter_subtrees())

for subtree in reversed(subtrees):
for subtree in (subtrees):
getattr(self, subtree.data, self.__default__)(subtree)
return tree

@@ -165,7 +174,7 @@ class Transformer_NoRecurse(Transformer):
else:
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]

return _t(tree)


Завантаження…
Відмінити
Зберегти