| @@ -225,14 +225,14 @@ class Lark: | |||||
| def _build_lexer(self): | def _build_lexer(self): | ||||
| return TraditionalLexer(self.lexer_conf.tokens, ignore=self.lexer_conf.ignore, user_callbacks=self.lexer_conf.callbacks) | 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.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) | 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) | return self.parser_class(self.lexer_conf, parser_conf, options=self.options) | ||||
| def serialize(self): | def serialize(self): | ||||
| @@ -246,15 +246,10 @@ class Lark: | |||||
| def deserialize(cls, data): | def deserialize(cls, data): | ||||
| from .grammar import Rule | from .grammar import Rule | ||||
| inst = cls.__new__(cls) | 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 | return inst | ||||