writer.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from math import ceil
  2. def write_statements(statements):
  3. '''Write a list of statements to valid assembly code.'''
  4. s = ''
  5. indent_level = 0
  6. prevline = ''
  7. for i, statement in enumerate(statements):
  8. statement_type, name, args = statement
  9. newline = '\n' if i else ''
  10. if statement_type == 'label':
  11. line = name + ':'
  12. indent_level = 1
  13. elif statement_type == 'comment':
  14. line = '#' + name
  15. if args['inline']:
  16. l = len(prevline.expandtabs(4))
  17. tabs = int(ceil((24 - l) / 4.)) + 1
  18. newline = '\t' * tabs
  19. else:
  20. line = '\t' * indent_level + line
  21. elif statement_type == 'directive':
  22. line = '\t' + name
  23. elif statement_type == 'command':
  24. line = '\t' + name
  25. if len(args['args']):
  26. l = len(name)
  27. if l < 8:
  28. line += '\t'
  29. else:
  30. line += ' '
  31. line += ','.join(args['args'])
  32. else:
  33. raise Exception('Unsupported statement type "%s"' % statement_type)
  34. s += newline + line
  35. prevline = line
  36. return s
  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()