Bladeren bron

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 jaren geleden
bovenliggende
commit
cb18cf5e77
1 gewijzigde bestanden met toevoegingen van 12 en 3 verwijderingen
  1. +12
    -3
      lark/tree.py

+ 12
- 3
lark/tree.py Bestand weergeven

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


Laden…
Annuleren
Opslaan