From d5c617f0fe6f1d717a30e0d392279aa5dffd0a62 Mon Sep 17 00:00:00 2001 From: Erez Shinan Date: Wed, 28 Feb 2018 17:59:45 +0200 Subject: [PATCH] BUGFIX: Non-linearity in tree construction, causing performance issues for large inputs (Issue #94) --- lark/parse_tree_builder.py | 5 ++++- lark/tree.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lark/parse_tree_builder.py b/lark/parse_tree_builder.py index de88cd1..c56483b 100644 --- a/lark/parse_tree_builder.py +++ b/lark/parse_tree_builder.py @@ -61,7 +61,10 @@ class ChildFilter: filtered = [] for i, to_expand in self.to_include: if to_expand: - filtered += children[i].children + if filtered: + filtered += children[i].children + else: # Optimize for left-recursion + filtered = children[i].children else: filtered.append(children[i]) diff --git a/lark/tree.py b/lark/tree.py index a9d4670..68eaf42 100644 --- a/lark/tree.py +++ b/lark/tree.py @@ -11,7 +11,7 @@ from .utils import inline_args class Tree(object): def __init__(self, data, children): self.data = data - self.children = list(children) + self.children = children def __repr__(self): return 'Tree(%s, %s)' % (self.data, self.children)