Brainfuck_PY_interpreter/main.py

92 lines
2.7 KiB
Python

"""
@author: Mateusz779
"""
pointer = 0
cell = []
code = ""
def main():
"""
Main function
"""
global code, cell, pointer
code = input("Enter the code: ")
print("\n\n")
if code != "":
for i in range(len(code)):
interpreter(code[i], i)
print("\n\n")
def interpreter(znak, i):
"""
Brainfuck interpreter
> increment the data pointer (to point to the next cell to the right).
< decrement the data pointer (to point to the next cell to the left).
+ increment (increase by one) the byte at the data pointer.
- decrement (decrease by one) the byte at the data pointer.
. output the byte at the data pointer.
, accept one byte of input, storing its value in the byte at the data pointer.
[ if the byte at the data pointer is zero, then instead of
moving the instruction pointer forward to the next command,
jump it forward to the command after the matching ]
] if the byte at the data pointer is nonzero, then instead of moving
the instruction pointer forward to the next command,
jump it back to the command after the matching [.
"""
global code, cell, pointer
match znak:
case ">":
pointer += 1
if(pointer > len(cell) - 1):
cell.append(0)
case "<":
pointer -= 1
if pointer < 0:
pointer = 0
cell.insert(0, 0)
case "+":
try:
cell[pointer] += 1
except:
cell.append(0)
cell[pointer] += 1
case "-":
try:
cell[pointer] -= 1
if cell[pointer] < 0:
cell[pointer] = 0
except:
cell.append(0)
case ".":
try:
if cell[pointer] == 10 or cell[pointer] == 13:
print("\n")
else:
print(chr(cell[pointer]), end="")
except:
cell.append(0)
print(chr(cell[pointer]), end="")
case ",":
try:
cell[pointer] = ord(input("Enter a character: "))
except:
cell.append(0)
cell[pointer] = ord(input("Enter a character: "))
case "[":
try:
loop_begin = i
if cell[pointer] != 0:
loop_end = code.find("]", i)
for a in range(0, cell[pointer]-1):
for j in range(1, loop_end-loop_begin):
interpreter(code[loop_begin + j], loop_begin + j)
except:
cell.append(0)
if __name__ == '__main__':
main()