This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

69 linhas
2.2 KiB

  1. from copy import deepcopy
  2. from types import ModuleType
  3. from typing import Callable, Collection, Dict, Optional, TYPE_CHECKING
  4. if TYPE_CHECKING:
  5. from .lark import PostLex
  6. from .utils import Serialize
  7. from .lexer import TerminalDef, Token
  8. ###{standalone
  9. _Callback = Callable[[Token], Token]
  10. class LexerConf(Serialize):
  11. __serialize_fields__ = 'terminals', 'ignore', 'g_regex_flags', 'use_bytes', 'lexer_type'
  12. __serialize_namespace__ = TerminalDef,
  13. terminals: Collection[TerminalDef]
  14. re_module: ModuleType
  15. ignore: Collection[str]
  16. postlex: 'Optional[PostLex]'
  17. callbacks: Dict[str, _Callback]
  18. g_regex_flags: int
  19. skip_validation: bool
  20. use_bytes: bool
  21. def __init__(self, terminals: Collection[TerminalDef], re_module: ModuleType, ignore: Collection[str]=(), postlex: 'Optional[PostLex]'=None, callbacks: Optional[Dict[str, _Callback]]=None, g_regex_flags: int=0, skip_validation: bool=False, use_bytes: bool=False):
  22. self.terminals = terminals
  23. self.terminals_by_name = {t.name: t for t in self.terminals}
  24. assert len(self.terminals) == len(self.terminals_by_name)
  25. self.ignore = ignore
  26. self.postlex = postlex
  27. self.callbacks = callbacks or {}
  28. self.g_regex_flags = g_regex_flags
  29. self.re_module = re_module
  30. self.skip_validation = skip_validation
  31. self.use_bytes = use_bytes
  32. self.lexer_type = None
  33. def _deserialize(self):
  34. self.terminals_by_name = {t.name: t for t in self.terminals}
  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. class ParserConf(Serialize):
  47. __serialize_fields__ = 'rules', 'start', 'parser_type'
  48. def __init__(self, rules, callbacks, start):
  49. assert isinstance(start, list)
  50. self.rules = rules
  51. self.callbacks = callbacks
  52. self.start = start
  53. self.parser_type = None
  54. ###}