Guest User

Untitled

a guest
Jul 17th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.42 KB | None | 0 0
  1. def compile(tokens):
  2. d = {'+':'PLUS', '.':'PRINT', 'I':'I', 'CR':'CR'}
  3. code_list = []
  4. branch_stack = []
  5. words = {}
  6. start = 0
  7. i = 0
  8. while i < len(tokens):
  9. token = tokens[i]
  10. if is_int(token):
  11. codes = ('PUSH', int(token))
  12.  
  13. elif token == 'IF':
  14. branch_stack.append(len(code_list)+1)
  15. codes = ('IF', None)
  16. elif token == 'ELSE':
  17. code_list[branch_stack.pop()] = len(code_list)+2
  18. branch_stack.append(len(code_list)+1)
  19. codes = ('ELSE', None)
  20. elif token == 'THEN':
  21. code_list[branch_stack.pop()] = len(code_list) + 1
  22. codes = ('THEN',)
  23.  
  24. elif token == 'DO':
  25. branch_stack.append(len(code_list) + 1)
  26. codes = ('DO',)
  27. elif token == 'LOOP':
  28. codes = ('LOOP', branch_stack.pop())
  29.  
  30. elif token == ':':
  31. words[tokens[i+1]] = len(code_list)
  32. codes = ()
  33. i += 1
  34. elif token == ';':
  35. start = len(code_list)+1
  36. codes = ('RET', )
  37.  
  38. elif token in d:
  39. codes = (d[token],)
  40. elif token in words:
  41. codes = ('CALL', words[token])
  42.  
  43. else:
  44. pass
  45.  
  46. code_list.extend(codes)
  47. i += 1
  48.  
  49. code_list.append('END')
  50. return code_list, start
  51.  
  52. def is_int(s):
  53. try:
  54. int(s)
  55. except ValueError:
  56. return False
  57. return True
Add Comment
Please, Sign In to add comment