Skip to content

Instantly share code, notes, and snippets.

@RK11
Created September 28, 2012 21:40
Show Gist options
  • Select an option

  • Save RK11/3802219 to your computer and use it in GitHub Desktop.

Select an option

Save RK11/3802219 to your computer and use it in GitHub Desktop.
A brainfuck interpreter (Not completely done, please report bugs)
#Python Brainfuck interpreter, made by RK11
#Version 0.2
#Changelog:
#0.1> First version
#0.2> Better output, and debug mode
import sys, time
class bf:
def __init__(self, input_bf, debug = False):
self.input = input_bf
self.bytes = [0]*1000000
self.pointer = 0
self.loops = []
self.output = ""
self.pos = 0
self.find_loops()
self.debug = debug
def find_loops(self): #Find all loops, and the posistions of the matching brackets
opening_brackets = []
closing_brackets = []
level = -1
for pos in range(len(self.input)):
if self.input[pos] == "[":
opening_brackets.append(pos)
closing_brackets.append(-1)
if self.input[pos] == "]":
a = len(closing_brackets)-1
while a >= 0:
if closing_brackets[a] == -1:
closing_brackets[a] = pos
break
a -= 1
for pos in range(len(opening_brackets)):
self.loops.append([opening_brackets[pos],closing_brackets[pos]])
def find_matching_bracket(self): #Return the matching bracket of a another bracket
for twobrackets in self.loops:
for pos in range(2):
if self.pos == twobrackets[pos]:
return twobrackets[1-pos]
def ex(self): #Execute the program
while self.pos < len(self.input):
char = self.input[self.pos] #actual character
if char == "+":
self.bytes[self.pointer] += 1
if self.bytes[self.pointer] > 255:
self.bytes[self.pointer] = 0
if char == "-":
self.bytes[self.pointer] -= 1
if self.bytes[self.pointer] < 0:
self.bytes[self.pointer] = 255
if char == "<":
self.pointer -= 1
if char == ">":
self.pointer += 1
if char == ".":
self.output += chr(self.bytes[self.pointer] % 256)
if char == "[":
if self.bytes[self.pointer] == 0:
self.pos = self.find_matching_bracket()
if char == "]":
if self.bytes[self.pointer]:
self.pos = self.find_matching_bracket()
if char == ",":
self.bytes[self.pointer] = ord(raw_input("\n>"))
#Update the output
sys.stdout.write("\r{} ".format(self.output))
sys.stdout.flush()
if self.debug:
print ("{} {}".format(self.bytes[:10], char)) #change this value to print more or less bytes
time.sleep(0.1)#You can increase the speed by decreasing this value
self.pos += 1
print "\n"
self.output = 0
#usage:
#test = bf(">+++++++++++++[<+++++>-]>+++++[<+++++>-]<+[<.+>-]")
#test.ex() #Should print the alphabet
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment