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.

89 lines
2.2 KiB

  1. import re
  2. import sys
  3. from .utils import get_regexp_width
  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. def to_regexp(self):
  30. raise NotImplementedError()
  31. if Py36:
  32. # Python 3.6 changed syntax for flags in regular expression
  33. def _get_flags(self, value):
  34. for f in self.flags:
  35. value = ('(?%s:%s)' % (f, value))
  36. return value
  37. else:
  38. def _get_flags(self, value):
  39. for f in self.flags:
  40. value = ('(?%s)' % f) + value
  41. return value
  42. class PatternStr(Pattern):
  43. def to_regexp(self):
  44. return self._get_flags(re.escape(self.value))
  45. @property
  46. def min_width(self):
  47. return len(self.value)
  48. max_width = min_width
  49. class PatternRE(Pattern):
  50. def to_regexp(self):
  51. return self._get_flags(self.value)
  52. @property
  53. def min_width(self):
  54. return get_regexp_width(self.to_regexp())[0]
  55. @property
  56. def max_width(self):
  57. return get_regexp_width(self.to_regexp())[1]
  58. class TokenDef(object):
  59. def __init__(self, name, pattern, priority=1):
  60. assert isinstance(pattern, Pattern), pattern
  61. self.name = name
  62. self.pattern = pattern
  63. self.priority = priority
  64. def __repr__(self):
  65. return '%s(%r, %r)' % (type(self).__name__, self.name, self.pattern)