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