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
from io import open
import pickle


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

from .lexer import Lexer, TraditionalLexer
from .lexer import Lexer, TraditionalLexer, TerminalDef
from .parse_tree_builder import ParseTreeBuilder
from .parser_frontends import get_frontend
from .grammar import Rule
@@ -238,8 +240,10 @@ class Lark(Serialize):
memo = SerializeMemoizer.deserialize(memo, namespace, {})
inst = cls.__new__(cls)
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.rules = [Rule.deserialize(r, memo) for r in data['rules']]
inst.source = '<deserialized>'
@@ -247,6 +251,17 @@ class Lark(Serialize):
inst.parser = inst.parser_class.deserialize(data['parser'], memo, inst._callbacks, inst.options.postlex)
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
def open(cls, grammar_filename, rel_to=None, **options):


Loading…
Cancel
Save