This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
2.1 KiB

  1. import re
  2. import sys
  3. from .utils import get_regexp_width, STRING_TYPE
  4. Py36 = (sys.version_info[:2] >= (3, 6))
  5. ###{standalone
  6. ###}
  7. class LexerConf:
  8. def __init__(self, tokens, ignore=(), postlex=None, callbacks=None):
  9. self.tokens = tokens
  10. self.ignore = ignore
  11. self.postlex = postlex
  12. self.callbacks = callbacks or {}
  13. class ParserConf:
  14. def __init__(self, rules, callback, start):
  15. self.rules = rules
  16. self.callback = callback
  17. self.start = start
  18. class Pattern(object):
  19. def __init__(self, value, flags=()):
  20. self.value = value
  21. self.flags = frozenset(flags)
  22. def __repr__(self):
  23. return repr(self.to_regexp())
  24. # Pattern Hashing assumes all subclasses have a different priority!
  25. def __hash__(self):
  26. return hash((type(self), self.value, self.flags))
  27. def __eq__(self, other):
  28. return type(self) == type(other) and self.value == other.value and self.flags == other.flags
  29. if Py36:
  30. # Python 3.6 changed syntax for flags in regular expression
  31. def _get_flags(self, value):
  32. for f in self.flags:
  33. value = ('(?%s:%s)' % (f, value))
  34. return value
  35. else:
  36. def _get_flags(self, value):
  37. for f in self.flags:
  38. value = ('(?%s)' % f) + value
  39. return value
  40. class PatternStr(Pattern):
  41. def to_regexp(self):
  42. return self._get_flags(re.escape(self.value))
  43. @property
  44. def min_width(self):
  45. return len(self.value)
  46. max_width = min_width
  47. class PatternRE(Pattern):
  48. def to_regexp(self):
  49. return self._get_flags(self.value)
  50. @property
  51. def min_width(self):
  52. return get_regexp_width(self.to_regexp())[0]
  53. @property
  54. def max_width(self):
  55. return get_regexp_width(self.to_regexp())[1]
  56. class TokenDef(object):
  57. def __init__(self, name, pattern, priority=1):
  58. assert isinstance(pattern, Pattern), pattern
  59. self.name = name
  60. self.pattern = pattern
  61. self.priority = priority
  62. def __repr__(self):
  63. return '%s(%r, %r)' % (type(self).__name__, self.name, self.pattern)