Browse Source

Merge pull request #636 from adefazio/master

Fixes caching when custom lexers are used
tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.10.0
Erez Shinan 5 years ago
committed by GitHub
parent
commit
b2d1761cca
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 3 deletions
  1. +8
    -3
      lark/parser_frontends.py
  2. +16
    -0
      tests/test_cache.py

+ 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