Created
January 17, 2017 09:34
-
-
Save volnt/1f76ff7b7f054868a89c6da52ec6b6d5 to your computer and use it in GitHub Desktop.
Brainfuck interpreter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from collections import defaultdict | |
import sys | |
PTR = 0 | |
class Memory(defaultdict): | |
def __init__(self): | |
super(Memory, self).__init__(lambda: 0) | |
MEM = Memory() | |
def evaltoken(token): | |
global PTR | |
global MEM | |
for char in token: | |
if char == '>': | |
PTR += 1 | |
elif char == '<': | |
PTR -= 1 | |
elif char == '+': | |
MEM[PTR] += 1 | |
elif char == '-': | |
MEM[PTR] -= 1 | |
elif char == '.': | |
sys.stdout.write(chr(MEM[PTR])) | |
elif char == ',': | |
MEM[PTR] = ord(sys.stdin.read(1)) | |
def evalbf(bf, loop=False): | |
global PTR | |
global MEM | |
if bf: | |
token = bf.pop(0) | |
else: | |
return | |
if token == '[': | |
while token != ']' and bf: | |
evalbf(bf, loop=True) | |
if bf: | |
bf.pop(0) | |
return | |
else: | |
evaltoken(token) | |
while loop and MEM[PTR] != 0: | |
evaltoken(token) | |
if bf: | |
evalbf(bf) | |
def main(): | |
global PTR | |
global MEM | |
while True: | |
bf = raw_input('in: ') | |
if bf == 'dump': | |
print PTR, MEM | |
continue | |
if bf == 'reset': | |
PTR = 0 | |
MEM.clear() | |
continue | |
bf = bf.replace('[', ' [ ').replace(']', ' ] ').split() | |
evalbf(bf) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment