Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/lark/common.py: 81%
57 statements
« prev ^ index » next coverage.py v7.3.1, created at 2023-09-25 06:30 +0000
« prev ^ index » next coverage.py v7.3.1, created at 2023-09-25 06:30 +0000
1from copy import deepcopy
2import sys
3from types import ModuleType
4from typing import Callable, Collection, Dict, Optional, TYPE_CHECKING
6if TYPE_CHECKING:
7 from .lark import PostLex
8 from .lexer import Lexer
9 from typing import Union, Type
10 if sys.version_info >= (3, 8):
11 from typing import Literal
12 else:
13 from typing_extensions import Literal
14 if sys.version_info >= (3, 10):
15 from typing import TypeAlias
16 else:
17 from typing_extensions import TypeAlias
19from .utils import Serialize
20from .lexer import TerminalDef, Token
22###{standalone
24_ParserArgType: 'TypeAlias' = 'Literal["earley", "lalr", "cyk", "auto"]'
25_LexerArgType: 'TypeAlias' = 'Union[Literal["auto", "basic", "contextual", "dynamic", "dynamic_complete"], Type[Lexer]]'
26_Callback = Callable[[Token], Token]
28class LexerConf(Serialize):
29 __serialize_fields__ = 'terminals', 'ignore', 'g_regex_flags', 'use_bytes', 'lexer_type'
30 __serialize_namespace__ = TerminalDef,
32 terminals: Collection[TerminalDef]
33 re_module: ModuleType
34 ignore: Collection[str]
35 postlex: 'Optional[PostLex]'
36 callbacks: Dict[str, _Callback]
37 g_regex_flags: int
38 skip_validation: bool
39 use_bytes: bool
40 lexer_type: Optional[_LexerArgType]
41 strict: bool
43 def __init__(self, terminals: Collection[TerminalDef], re_module: ModuleType, ignore: Collection[str]=(), postlex: 'Optional[PostLex]'=None,
44 callbacks: Optional[Dict[str, _Callback]]=None, g_regex_flags: int=0, skip_validation: bool=False, use_bytes: bool=False, strict: bool=False):
45 self.terminals = terminals
46 self.terminals_by_name = {t.name: t for t in self.terminals}
47 assert len(self.terminals) == len(self.terminals_by_name)
48 self.ignore = ignore
49 self.postlex = postlex
50 self.callbacks = callbacks or {}
51 self.g_regex_flags = g_regex_flags
52 self.re_module = re_module
53 self.skip_validation = skip_validation
54 self.use_bytes = use_bytes
55 self.strict = strict
56 self.lexer_type = None
58 def _deserialize(self):
59 self.terminals_by_name = {t.name: t for t in self.terminals}
61 def __deepcopy__(self, memo=None):
62 return type(self)(
63 deepcopy(self.terminals, memo),
64 self.re_module,
65 deepcopy(self.ignore, memo),
66 deepcopy(self.postlex, memo),
67 deepcopy(self.callbacks, memo),
68 deepcopy(self.g_regex_flags, memo),
69 deepcopy(self.skip_validation, memo),
70 deepcopy(self.use_bytes, memo),
71 )
74class ParserConf(Serialize):
75 __serialize_fields__ = 'rules', 'start', 'parser_type'
77 def __init__(self, rules, callbacks, start):
78 assert isinstance(start, list)
79 self.rules = rules
80 self.callbacks = callbacks
81 self.start = start
83 self.parser_type = None
85###}