diff --git a/lark/lark.py b/lark/lark.py index 9fa5017..1ffa0af 100644 --- a/lark/lark.py +++ b/lark/lark.py @@ -225,14 +225,14 @@ class Lark: def _build_lexer(self): return TraditionalLexer(self.lexer_conf.tokens, ignore=self.lexer_conf.ignore, user_callbacks=self.lexer_conf.callbacks) - def _build_parser(self): + def _prepare_callbacks(self): self.parser_class = get_frontend(self.options.parser, self.options.lexer) - self._parse_tree_builder = ParseTreeBuilder(self.rules, self.options.tree_class, self.options.propagate_positions, self.options.keep_all_tokens, self.options.parser!='lalr' and self.options.ambiguity=='explicit', self.options.maybe_placeholders) - callbacks = self._parse_tree_builder.create_callback(self.options.transformer) - - parser_conf = ParserConf(self.rules, callbacks, self.options.start) + self._callbacks = self._parse_tree_builder.create_callback(self.options.transformer) + def _build_parser(self): + self._prepare_callbacks() + parser_conf = ParserConf(self.rules, self._callbacks, self.options.start) return self.parser_class(self.lexer_conf, parser_conf, options=self.options) def serialize(self): @@ -246,15 +246,10 @@ class Lark: def deserialize(cls, data): from .grammar import Rule inst = cls.__new__(cls) - - rules = [Rule.deserialize(r) for r in data['rules']] - options = LarkOptions.deserialize(data['options']) - - ptb = ParseTreeBuilder(rules, options.tree_class, options.propagate_positions, options.keep_all_tokens, options.parser!='lalr' and options.ambiguity=='explicit', options.maybe_placeholders) - callbacks = ptb.create_callback(None) - - parser_class = get_frontend(options.parser, options.lexer) - inst.parser = parser_class.deserialize(data['parser'], callbacks) + inst.options = LarkOptions.deserialize(data['options']) + inst.rules = [Rule.deserialize(r) for r in data['rules']] + inst._prepare_callbacks() + inst.parser = inst.parser_class.deserialize(data['parser'], inst._callbacks) return inst