writer.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from math import ceil
  2. def write_statements(statements):
  3. """Write a list of statements to valid assembly code."""
  4. out = ''
  5. indent_level = 0
  6. prevline = ''
  7. for i, s in enumerate(statements):
  8. newline = '\n' if i else ''
  9. if s.is_label():
  10. line = s.name + ':'
  11. indent_level = 1
  12. elif s.is_comment():
  13. line = '#' + s.name
  14. if s.is_inline_comment():
  15. l = len(prevline.expandtabs(4))
  16. tabs = int(ceil((24 - l) / 4.)) + 1
  17. newline = '\t' * tabs
  18. else:
  19. line = '\t' * indent_level + line
  20. elif s.is_directive():
  21. line = '\t' + s.name
  22. elif s.is_command():
  23. line = '\t' + s.name
  24. if len(s):
  25. if len(s.name) < 8:
  26. line += '\t'
  27. else:
  28. line += ' '
  29. line += ','.join(s.args)
  30. else:
  31. raise Exception('Unsupported statement type "%s"' % s.stype)
  32. out += newline + line
  33. prevline = line
  34. # Add newline at end of file
  35. out += '\n'
  36. return out
  37. def write_to_file(filename, statements):
  38. """Convert a list of statements to valid assembly code and write it to a
  39. file."""
  40. s = write_statements(statements)
  41. f = open(filename, 'w+')
  42. f.write(s)
  43. f.close()