Browse Source

Small refactor after PR

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.10.0
Erez Sh 4 years ago
parent
commit
2f4831f9b6
2 changed files with 11 additions and 10 deletions
  1. +5
    -7
      lark/lark.py
  2. +6
    -3
      lark/parser_frontends.py

+ 5
- 7
lark/lark.py View File

@@ -11,7 +11,7 @@ from .common import LexerConf, ParserConf

from .lexer import Lexer, TraditionalLexer, TerminalDef, UnexpectedToken
from .parse_tree_builder import ParseTreeBuilder
from .parser_frontends import get_frontend
from .parser_frontends import get_frontend, _get_lexer_callbacks
from .grammar import Rule

import re
@@ -278,12 +278,10 @@ class Lark(Serialize):
rule.options.priority = None

# TODO Deprecate lexer_callbacks?
lexer_callbacks = dict(self.options.lexer_callbacks)
if self.options.transformer:
t = self.options.transformer
for term in self.terminals:
if hasattr(t, term.name):
lexer_callbacks[term.name] = getattr(t, term.name)
lexer_callbacks = (_get_lexer_callbacks(self.options.transformer, self.terminals)
if self.options.transformer
else {})
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)



+ 6
- 3
lark/parser_frontends.py View File

@@ -58,9 +58,8 @@ class _ParserFrontend(Serialize):
return self.parser.parse(input, start, *args)


def _recreate_lexer_callbacks(memo, transformer):
def _get_lexer_callbacks(transformer, terminals):
result = {}
terminals = [item for item in memo.values() if isinstance(item, TerminalDef)]
for terminal in terminals:
callback = getattr(transformer, terminal.name, None)
if callback is not None:
@@ -85,12 +84,16 @@ class WithLexer(_ParserFrontend):
@classmethod
def deserialize(cls, data, memo, callbacks, postlex, transformer, re_module):
inst = super(WithLexer, cls).deserialize(data, memo)

inst.postlex = postlex
inst.parser = LALR_Parser.deserialize(inst.parser, memo, callbacks)
inst.lexer_conf.callbacks = _recreate_lexer_callbacks(memo, transformer)

terminals = [item for item in memo.values() if isinstance(item, TerminalDef)]
inst.lexer_conf.callbacks = _get_lexer_callbacks(transformer, terminals)
inst.lexer_conf.re_module = re_module
inst.lexer_conf.skip_validation=True
inst.init_lexer()

return inst

def _serialize(self, data, memo):


Loading…
Cancel
Save