Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def compile(tokens):
- d = {'+':'PLUS', '.':'PRINT', 'I':'I', 'CR':'CR'}
- code_list = []
- branch_stack = []
- words = {}
- start = 0
- i = 0
- while i < len(tokens):
- token = tokens[i]
- if is_int(token):
- codes = ('PUSH', int(token))
- elif token == 'IF':
- branch_stack.append(len(code_list)+1)
- codes = ('IF', None)
- elif token == 'ELSE':
- code_list[branch_stack.pop()] = len(code_list)+2
- branch_stack.append(len(code_list)+1)
- codes = ('ELSE', None)
- elif token == 'THEN':
- code_list[branch_stack.pop()] = len(code_list) + 1
- codes = ('THEN',)
- elif token == 'DO':
- branch_stack.append(len(code_list) + 1)
- codes = ('DO',)
- elif token == 'LOOP':
- codes = ('LOOP', branch_stack.pop())
- elif token == ':':
- words[tokens[i+1]] = len(code_list)
- codes = ()
- i += 1
- elif token == ';':
- start = len(code_list)+1
- codes = ('RET', )
- elif token in d:
- codes = (d[token],)
- elif token in words:
- codes = ('CALL', words[token])
- else:
- pass
- code_list.extend(codes)
- i += 1
- code_list.append('END')
- return code_list, start
- def is_int(s):
- try:
- int(s)
- except ValueError:
- return False
- return True
Add Comment
Please, Sign In to add comment