This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

68 行
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. ###}