writer.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. return out
  35. def write_to_file(filename, statements):
  36. """Convert a list of statements to valid assembly code and write it to a
  37. file."""
  38. s = write_statements(statements)
  39. f = open(filename, 'w+')
  40. f.write(s)
  41. f.close()