tokenizer.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # Copyright (C) 2022 The Qt Company Ltd.
  2. # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
  3. from __future__ import annotations
  4. """Tool to dump Python Tokens"""
  5. import sys
  6. import tokenize
  7. def format_token(t):
  8. r = repr(t)
  9. if r.startswith('TokenInfo('):
  10. r = r[10:]
  11. pos = r.find("), line='")
  12. if pos < 0:
  13. pos = r.find('), line="')
  14. if pos > 0:
  15. r = r[:pos + 1]
  16. return r
  17. def first_non_space(s):
  18. for i, c in enumerate(s):
  19. if c != ' ':
  20. return i
  21. return 0
  22. if __name__ == '__main__':
  23. if len(sys.argv) < 2:
  24. print("Specify file Name")
  25. sys.exit(1)
  26. filename = sys.argv[1]
  27. indent_level = 0
  28. indent = ''
  29. last_line_number = -1
  30. with tokenize.open(filename) as f:
  31. generator = tokenize.generate_tokens(f.readline)
  32. for t in generator:
  33. line_number = t.start[0]
  34. if line_number != last_line_number:
  35. code_line = t.line.rstrip()
  36. non_space = first_non_space(code_line)
  37. print('{:04d} {}{}'.format(line_number, '_' * non_space,
  38. code_line[non_space:]))
  39. last_line_number = line_number
  40. if t.type == tokenize.INDENT:
  41. indent_level = indent_level + 1
  42. indent = ' ' * indent_level
  43. elif t.type == tokenize.DEDENT:
  44. indent_level = indent_level - 1
  45. indent = ' ' * indent_level
  46. else:
  47. print(' ', indent, format_token(t))