Browse Source

Fixes caching when custom lexers are used

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.10.0
Inky 5 years ago
committed by Aaron Defazio
parent
commit
fcaf10ac4d
3 changed files with 25 additions and 3 deletions
  1. +1
    -0
      lark-stubs/lark.pyi
  2. +8
    -3
      lark/parser_frontends.py
  3. +16
    -0
      tests/test_cache.py

+ 1
- 0
lark-stubs/lark.pyi View File

@@ -55,6 +55,7 @@ class Lark:
propagate_positions: bool = False, propagate_positions: bool = False,
maybe_placeholders: bool = False, maybe_placeholders: bool = False,
lexer_callbacks: Optional[Dict[str, Callable[[Token], Token]]] = None, lexer_callbacks: Optional[Dict[str, Callable[[Token], Token]]] = None,
cache: Union[bool, str] = False,
g_regex_flags: int = ... g_regex_flags: int = ...
): ):
... ...


+ 8
- 3
lark/parser_frontends.py View File

@@ -1,5 +1,3 @@
from functools import partial

from .utils import get_regexp_width, Serialize from .utils import get_regexp_width, Serialize
from .parsers.grammar_analysis import GrammarAnalyzer from .parsers.grammar_analysis import GrammarAnalyzer
from .lexer import TraditionalLexer, ContextualLexer, Lexer, Token from .lexer import TraditionalLexer, ContextualLexer, Lexer, Token
@@ -20,7 +18,14 @@ def get_frontend(parser, lexer):
elif lexer == 'contextual': elif lexer == 'contextual':
return LALR_ContextualLexer return LALR_ContextualLexer
elif issubclass(lexer, Lexer): elif issubclass(lexer, Lexer):
return partial(LALR_CustomLexer, lexer)
class LALR_CustomLexerWrapper(LALR_CustomLexer):
def __init__(self, lexer_conf, parser_conf, options=None):
super(LALR_CustomLexerWrapper, self).__init__(
lexer, lexer_conf, parser_conf, options=options)
def init_lexer(self):
self.lexer = lexer(self.lexer_conf)

return LALR_CustomLexerWrapper
else: else:
raise ValueError('Unknown lexer: %s' % lexer) raise ValueError('Unknown lexer: %s' % lexer)
elif parser=='earley': elif parser=='earley':


+ 16
- 0
tests/test_cache.py View File

@@ -4,6 +4,7 @@ import sys
from unittest import TestCase, main from unittest import TestCase, main


from lark import Lark, Tree from lark import Lark, Tree
from lark.lexer import Lexer, Token
import lark.lark as lark_module import lark.lark as lark_module


try: try:
@@ -38,6 +39,15 @@ class MockFS:
return name in self.files return name in self.files




class CustomLexer(Lexer):
def __init__(self, lexer_conf):
pass

def lex(self, data):
for obj in data:
yield Token('A', obj)


class TestCache(TestCase): class TestCache(TestCase):
def setUp(self): def setUp(self):
pass pass
@@ -70,6 +80,12 @@ class TestCache(TestCase):
parser = Lark(g, parser='lalr', cache=True) parser = Lark(g, parser='lalr', cache=True)
assert parser.parse('a') == Tree('start', []) assert parser.parse('a') == Tree('start', [])


# Test with custom lexer
mock_fs.files = {}
parser = Lark(g, parser='lalr', lexer=CustomLexer, cache=True)
parser = Lark(g, parser='lalr', lexer=CustomLexer, cache=True)
assert len(mock_fs.files) == 1
assert parser.parse('a') == Tree('start', [])
finally: finally:
lark_module.FS = fs lark_module.FS = fs




Loading…
Cancel
Save