1from warnings import warn
2from copy import deepcopy
3
4from .utils import Serialize
5from .lexer import TerminalDef
6
7###{standalone
8
9
10class LexerConf(Serialize):
11    __serialize_fields__ = 'terminals', 'ignore', 'g_regex_flags', 'use_bytes', 'lexer_type'
12    __serialize_namespace__ = TerminalDef,
13
14    def __init__(self, terminals, re_module, ignore=(), postlex=None, callbacks=None, g_regex_flags=0, skip_validation=False, use_bytes=False):
15        self.terminals = terminals
16        self.terminals_by_name = {t.name: t for t in self.terminals}
17        assert len(self.terminals) == len(self.terminals_by_name)
18        self.ignore = ignore
19        self.postlex = postlex
20        self.callbacks = callbacks or {}
21        self.g_regex_flags = g_regex_flags
22        self.re_module = re_module
23        self.skip_validation = skip_validation
24        self.use_bytes = use_bytes
25        self.lexer_type = None
26
27    @property
28    def tokens(self):
29        warn("LexerConf.tokens is deprecated. Use LexerConf.terminals instead", DeprecationWarning)
30        return self.terminals
31
32    def _deserialize(self):
33        self.terminals_by_name = {t.name: t for t in self.terminals}
34
35    def __deepcopy__(self, memo=None):
36        return type(self)(
37            deepcopy(self.terminals, memo),
38            self.re_module,
39            deepcopy(self.ignore, memo),
40            deepcopy(self.postlex, memo),
41            deepcopy(self.callbacks, memo),
42            deepcopy(self.g_regex_flags, memo),
43            deepcopy(self.skip_validation, memo),
44            deepcopy(self.use_bytes, memo),
45        )
46
47
48class ParserConf(Serialize):
49    __serialize_fields__ = 'rules', 'start', 'parser_type'
50
51    def __init__(self, rules, callbacks, start):
52        assert isinstance(start, list)
53        self.rules = rules
54        self.callbacks = callbacks
55        self.start = start
56
57        self.parser_type = None
58
59###}
60