From a5625a3be9f0280fe9674c3f14a36c5fc399929a Mon Sep 17 00:00:00 2001 From: Kevin Latimer Date: Mon, 18 Dec 2017 11:52:54 -0500 Subject: [PATCH 1/3] Add delete functionality --- lark/tree.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/lark/tree.py b/lark/tree.py index 90583db..81a9929 100644 --- a/lark/tree.py +++ b/lark/tree.py @@ -95,7 +95,13 @@ class Transformer(object): return getattr(self, name) def transform(self, tree): - items = [self.transform(c) if isinstance(c, Tree) else c for c in tree.children] + items = [] + for c in tree.children: + if isinstance(c, Tree): + try: + items.append(self.transform(c)) + except Erase: + pass try: f = self._get_func(tree.data) except AttributeError: @@ -110,6 +116,9 @@ class Transformer(object): return TransformerChain(self, other) +class Erase(Exception): + pass + class TransformerChain(object): def __init__(self, *transformers): self.transformers = transformers @@ -166,7 +175,16 @@ class Transformer_NoRecurse(Transformer): return f(t) for subtree in reversed(subtrees): - subtree.children = [_t(c) if isinstance(c, Tree) else c for c in subtree.children] + children = [] + for c in subtree.children: + if isinstance(c, Tree): + try: + children.append(_t(c)) + except Erase: + pass + else: + children.append(c) + subtree.children = children return _t(tree) From 26ce48b940aab5ea88a102407310d9fe77d25263 Mon Sep 17 00:00:00 2001 From: Kevin Latimer Date: Mon, 18 Dec 2017 14:51:07 -0500 Subject: [PATCH 2/3] Bug fix for Discard and make the syntax more pythonic --- lark/tree.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/lark/tree.py b/lark/tree.py index 300e3f6..824bce6 100644 --- a/lark/tree.py +++ b/lark/tree.py @@ -106,11 +106,10 @@ class Transformer(object): def transform(self, tree): items = [] for c in tree.children: - if isinstance(c, Tree): - try: - items.append(self.transform(c)) - except Discard: - pass + try: + items.append(self.transform(c) if isinstance(c, Tree) else c) + except Discard: + pass try: f = self._get_func(tree.data) except AttributeError: @@ -183,16 +182,13 @@ class Transformer_NoRecurse(Transformer): else: return f(t) - for subtree in (subtrees): + for subtree in reversed(subtrees): children = [] for c in subtree.children: - if isinstance(c, Tree): - try: - children.append(_t(c)) - except Discard: - pass - else: - children.append(c) + try: + children.append(_t(c) if isinstance(c, Tree) else c) + except Discard: + pass subtree.children = children return _t(tree) From 240cf1ca2133ede2d95c791a482b32359b0bdfc4 Mon Sep 17 00:00:00 2001 From: Kevin Latimer Date: Mon, 18 Dec 2017 15:28:23 -0500 Subject: [PATCH 3/3] Bug fixes to Transformer_NoRecurse --- lark/tree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lark/tree.py b/lark/tree.py index 824bce6..f832857 100644 --- a/lark/tree.py +++ b/lark/tree.py @@ -182,7 +182,7 @@ class Transformer_NoRecurse(Transformer): else: return f(t) - for subtree in reversed(subtrees): + for subtree in subtrees: children = [] for c in subtree.children: try: