From 94da6c52b80444c141af50562b507155ca88526d Mon Sep 17 00:00:00 2001 From: Erez Sh Date: Tue, 1 Oct 2019 23:17:21 +0300 Subject: [PATCH] Refactored the Earley code to make it thread-safe (Issue #454) --- lark/parsers/earley.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lark/parsers/earley.py b/lark/parsers/earley.py index ff4e125..87920c3 100644 --- a/lark/parsers/earley.py +++ b/lark/parsers/earley.py @@ -46,12 +46,8 @@ class Parser: # skip the extra tree walk. We'll also skip this if the user just didn't specify priorities # on any rules. if self.forest_sum_visitor is None and rule.options and rule.options.priority is not None: - self.forest_sum_visitor = ForestSumVisitor() + self.forest_sum_visitor = ForestSumVisitor - if resolve_ambiguity: - self.forest_tree_visitor = ForestToTreeVisitor(self.callbacks, self.forest_sum_visitor) - else: - self.forest_tree_visitor = ForestToAmbiguousTreeVisitor(self.callbacks, self.forest_sum_visitor) self.term_matcher = term_matcher @@ -316,7 +312,10 @@ class Parser: assert False, 'Earley should not generate multiple start symbol items!' # Perform our SPPF -> AST conversion using the right ForestVisitor. - return self.forest_tree_visitor.visit(solutions[0]) + forest_tree_visitor_cls = ForestToTreeVisitor if self.resolve_ambiguity else ForestToAmbiguousTreeVisitor + forest_tree_visitor = forest_tree_visitor_cls(self.callbacks, self.forest_sum_visitor and self.forest_sum_visitor()) + + return forest_tree_visitor.visit(solutions[0]) class ApplyCallbacks(Transformer_InPlace):