Browse Source

Cleanup and refactor

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.11.3
Erez Sh 3 years ago
parent
commit
0199afa4c8
3 changed files with 21 additions and 37 deletions
  1. +21
    -14
      lark/lark.py
  2. +0
    -13
      lark/parser_frontends.py
  3. +0
    -10
      tests/test_cache.py

+ 21
- 14
lark/lark.py View File

@@ -343,10 +343,10 @@ class Lark(Serialize):
rule.options.priority = None rule.options.priority = None


# TODO Deprecate lexer_callbacks? # TODO Deprecate lexer_callbacks?
lexer_callbacks = {}
lexer_callbacks.update(self.options.lexer_callbacks)
self.lexer_conf = LexerConf(self.terminals, re_module, self.ignore_tokens, self.options.postlex, lexer_callbacks, self.options.g_regex_flags, use_bytes=self.options.use_bytes)
self.lexer_conf = LexerConf(
self.terminals, re_module, self.ignore_tokens, self.options.postlex,
self.options.lexer_callbacks, self.options.g_regex_flags, use_bytes=self.options.use_bytes
)


if self.options.parser: if self.options.parser:
self.parser = self._build_parser() self.parser = self._build_parser()
@@ -383,14 +383,14 @@ class Lark(Serialize):
self.options.parser != 'lalr' and self.options.ambiguity == 'explicit', self.options.parser != 'lalr' and self.options.ambiguity == 'explicit',
self.options.maybe_placeholders self.options.maybe_placeholders
) )
self._callbacks.update(self._parse_tree_builder.create_callback(self.options.transformer))
self._callbacks = self._parse_tree_builder.create_callback(self.options.transformer)
self._callbacks.update(_get_lexer_callbacks(self.options.transformer, self.terminals)) self._callbacks.update(_get_lexer_callbacks(self.options.transformer, self.terminals))


def _build_parser(self): def _build_parser(self):
self.parser_class = get_frontend(self.options.parser, self.options.lexer)
self._prepare_callbacks() self._prepare_callbacks()
parser_class = get_frontend(self.options.parser, self.options.lexer)
parser_conf = ParserConf(self.rules, self._callbacks, self.options.start) parser_conf = ParserConf(self.rules, self._callbacks, self.options.start)
return self.parser_class(self.lexer_conf, parser_conf, options=self.options)
return parser_class(self.lexer_conf, parser_conf, options=self.options)


def save(self, f): def save(self, f):
"""Saves the instance into the given file object """Saves the instance into the given file object
@@ -409,6 +409,16 @@ class Lark(Serialize):
inst = cls.__new__(cls) inst = cls.__new__(cls)
return inst._load(f) return inst._load(f)


def _deserialize_lexer_conf(self, data, memo, options):
lexer_conf = LexerConf.deserialize(data['lexer_conf'], memo)
lexer_conf.callbacks = options.lexer_callbacks or {}
lexer_conf.re_module = regex if options.regex else re
lexer_conf.use_bytes = options.use_bytes
lexer_conf.g_regex_flags = options.g_regex_flags
lexer_conf.skip_validation = True
lexer_conf.postlex = options.postlex
return lexer_conf

def _load(self, f, **kwargs): def _load(self, f, **kwargs):
if isinstance(f, dict): if isinstance(f, dict):
d = f d = f
@@ -427,15 +437,12 @@ class Lark(Serialize):
self.options = LarkOptions.deserialize(options, memo) self.options = LarkOptions.deserialize(options, memo)
self.rules = [Rule.deserialize(r, memo) for r in data['rules']] self.rules = [Rule.deserialize(r, memo) for r in data['rules']]
self.source_path = '<deserialized>' self.source_path = '<deserialized>'
self.parser_class = get_frontend(self.options.parser, self.options.lexer)
self.lexer_conf = self.parser_class.deserialize_lexer_conf( # We need the terminals list to for _prepare_callbacks
data['parser'],
memo,
self.options)
parser_class = get_frontend(self.options.parser, self.options.lexer)
self.lexer_conf = self._deserialize_lexer_conf(data['parser'], memo, self.options)
self.terminals = self.lexer_conf.terminals self.terminals = self.lexer_conf.terminals
self._terminals_dict = {t.name: t for t in self.terminals}
self._prepare_callbacks() self._prepare_callbacks()
self.parser = self.parser_class.deserialize(
self._terminals_dict = {t.name: t for t in self.terminals}
self.parser = parser_class.deserialize(
data['parser'], data['parser'],
memo, memo,
self.lexer_conf, self.lexer_conf,


+ 0
- 13
lark/parser_frontends.py View File

@@ -38,19 +38,6 @@ class MakeParsingFrontend:
parser_conf.parser_type = self.parser_type parser_conf.parser_type = self.parser_type
lexer_conf.lexer_type = self.lexer_type lexer_conf.lexer_type = self.lexer_type
return ParsingFrontend(lexer_conf, parser_conf, options) return ParsingFrontend(lexer_conf, parser_conf, options)
@classmethod
def deserialize_lexer_conf(cls, data, memo, options):
# We need lexer_conf earley to have the terminals that we need to produce the callback list for paser_conf
# So we split deserialize into two methods
lexer_conf = LexerConf.deserialize(data['lexer_conf'], memo)
lexer_conf.callbacks = options.lexer_callbacks or {}
lexer_conf.re_module = regex if options.regex else re
lexer_conf.use_bytes = options.use_bytes
lexer_conf.g_regex_flags = options.g_regex_flags
lexer_conf.skip_validation = True
lexer_conf.postlex = options.postlex
return lexer_conf


@classmethod @classmethod
def deserialize(cls, data, memo, lexer_conf, callbacks, options): def deserialize(cls, data, memo, lexer_conf, callbacks, options):


+ 0
- 10
tests/test_cache.py View File

@@ -1,6 +1,5 @@
from __future__ import absolute_import from __future__ import absolute_import


import sys
from unittest import TestCase, main from unittest import TestCase, main


from lark import Lark, Tree, Transformer from lark import Lark, Tree, Transformer
@@ -12,15 +11,6 @@ try:
except ImportError: except ImportError:
from io import BytesIO as StringIO from io import BytesIO as StringIO


import tempfile, os

class TestT(Transformer):
def add(self, children):
return sum(children if isinstance(children, list) else children.children)

def NUM(self, token):
return int(token)



class MockFile(StringIO): class MockFile(StringIO):
def close(self): def close(self):


Loading…
Cancel
Save