Browse Source

Added methods for saving/loading Lark instances with pickle (Issue #479)

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.8.2
Erez Sh 5 years ago
parent
commit
21d2016fca
1 changed files with 18 additions and 3 deletions
  1. +18
    -3
      lark/lark.py

+ 18
- 3
lark/lark.py View File

@@ -2,13 +2,15 @@ from __future__ import absolute_import


import os import os
from io import open from io import open
import pickle



from .utils import STRING_TYPE, Serialize, SerializeMemoizer from .utils import STRING_TYPE, Serialize, SerializeMemoizer
from .load_grammar import load_grammar from .load_grammar import load_grammar
from .tree import Tree from .tree import Tree
from .common import LexerConf, ParserConf from .common import LexerConf, ParserConf


from .lexer import Lexer, TraditionalLexer
from .lexer import Lexer, TraditionalLexer, TerminalDef
from .parse_tree_builder import ParseTreeBuilder from .parse_tree_builder import ParseTreeBuilder
from .parser_frontends import get_frontend from .parser_frontends import get_frontend
from .grammar import Rule from .grammar import Rule
@@ -238,8 +240,10 @@ class Lark(Serialize):
memo = SerializeMemoizer.deserialize(memo, namespace, {}) memo = SerializeMemoizer.deserialize(memo, namespace, {})
inst = cls.__new__(cls) inst = cls.__new__(cls)
options = dict(data['options']) options = dict(data['options'])
options['transformer'] = transformer
options['postlex'] = postlex
if transformer is not None:
options['transformer'] = transformer
if postlex is not None:
options['postlex'] = postlex
inst.options = LarkOptions.deserialize(options, memo) inst.options = LarkOptions.deserialize(options, memo)
inst.rules = [Rule.deserialize(r, memo) for r in data['rules']] inst.rules = [Rule.deserialize(r, memo) for r in data['rules']]
inst.source = '<deserialized>' inst.source = '<deserialized>'
@@ -247,6 +251,17 @@ class Lark(Serialize):
inst.parser = inst.parser_class.deserialize(data['parser'], memo, inst._callbacks, inst.options.postlex) inst.parser = inst.parser_class.deserialize(data['parser'], memo, inst._callbacks, inst.options.postlex)
return inst return inst


def save(self, f):
data, m = self.memo_serialize([TerminalDef, Rule])
pickle.dump({'data': data, 'memo': m}, f)

@classmethod
def load(cls, f):
d = pickle.load(f)
namespace = {'Rule': Rule, 'TerminalDef': TerminalDef}
memo = d['memo']
return Lark.deserialize(d['data'], namespace, memo)



@classmethod @classmethod
def open(cls, grammar_filename, rel_to=None, **options): def open(cls, grammar_filename, rel_to=None, **options):


Loading…
Cancel
Save