This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

56 行
1.7 KiB

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