Fixes caching when custom lexers are usedtags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.10.0
| @@ -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': | ||||
| @@ -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 | ||||