This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

68 rader
2.0 KiB

  1. "Provides Indentation services for languages with indentation similar to Python"
  2. from .exceptions import LarkError
  3. from .lark import PostLex
  4. from .lexer import Token
  5. ###{standalone
  6. class DedentError(LarkError):
  7. pass
  8. class Indenter(PostLex):
  9. def __init__(self):
  10. self.paren_level = None
  11. self.indent_level = None
  12. assert self.tab_len > 0
  13. def handle_NL(self, token):
  14. if self.paren_level > 0:
  15. return
  16. yield token
  17. indent_str = token.rsplit('\n', 1)[1] # Tabs and spaces
  18. indent = indent_str.count(' ') + indent_str.count('\t') * self.tab_len
  19. if indent > self.indent_level[-1]:
  20. self.indent_level.append(indent)
  21. yield Token.new_borrow_pos(self.INDENT_type, indent_str, token)
  22. else:
  23. while indent < self.indent_level[-1]:
  24. self.indent_level.pop()
  25. yield Token.new_borrow_pos(self.DEDENT_type, indent_str, token)
  26. if indent != self.indent_level[-1]:
  27. raise DedentError('Unexpected dedent to column %s. Expected dedent to %s' % (indent, self.indent_level[-1]))
  28. def _process(self, stream):
  29. for token in stream:
  30. if token.type == self.NL_type:
  31. for t in self.handle_NL(token):
  32. yield t
  33. else:
  34. yield token
  35. if token.type in self.OPEN_PAREN_types:
  36. self.paren_level += 1
  37. elif token.type in self.CLOSE_PAREN_types:
  38. self.paren_level -= 1
  39. assert self.paren_level >= 0
  40. while len(self.indent_level) > 1:
  41. self.indent_level.pop()
  42. yield Token(self.DEDENT_type, '')
  43. assert self.indent_level == [0], self.indent_level
  44. def process(self, stream):
  45. self.paren_level = 0
  46. self.indent_level = [0]
  47. return self._process(stream)
  48. # XXX Hack for ContextualLexer. Maybe there's a more elegant solution?
  49. @property
  50. def always_accept(self):
  51. return (self.NL_type,)
  52. ###}