Skip to content

Instantly share code, notes, and snippets.

@volnt
Created January 17, 2017 09:34
Show Gist options
  • Save volnt/1f76ff7b7f054868a89c6da52ec6b6d5 to your computer and use it in GitHub Desktop.
Save volnt/1f76ff7b7f054868a89c6da52ec6b6d5 to your computer and use it in GitHub Desktop.
Brainfuck interpreter
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:
print
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