Search code examples
pythonpython-3.xbrainfuck

brainfuck intepreter printing out wrong


I recently decided to try to code "yet another" brainfuck interpreter, but I have a problem. It prints out the wrong numbers, when it should put our hello,world!. Does anyone know why this is happening? Thanks in advance! I cannot figure out why it's doing this. Please help! I am only a beginner. Sorry for the bad coding style, but please don't change the whole thing. I would rather recieve tips.

from copy import copy
import sys

def brainfuckintepreter(program):
    # find pairs of brackets
    brackets = {}
    bbrackets = {}
    def findmatchingclosingbracket(ctr):
        level = 0
        if program[ctr] == '[':
            while True:
                if program[ctr] == '[':
                    level += 1
                elif program[ctr] == ']':
                    level -= 1
                if level == 0:
                    return ctr
                    break
                ctr += 1

    def findmatchingopeningbracket(ctr):
        level = 0
        if program[ctr] == ']':
            while True:
                if program[ctr] == '[':
                    level -= 1
                elif program[ctr] == ']':
                    level += 1
                if level == 0:
                    return ctr
                    break
                ctr -= 1
    """
    ctr = 0
    for a in program:
        if a == '[':
            f = copy(findmatchingclosingbracket(ctr))
            brackets[ctr] = f
            bbrackets[f] = ctr
        ctr += 1

    print(brackets)
    print(bbrackets)
    """
    # running the program
    tape = [0] * 3000
    pointer = 1500
    counter = 0
    results = ""
    valid = True
    while counter != len(program) and valid:
        a = program[counter]
        # move right
        if a == '>':
            if pointer == len(tape) - 1:
                tape.append(0)
            pointer += 1
        # move left
        elif a == '<':
            if pointer == 0:
                raise ValueError("On index ", counter, ", the program tried to move to -1 on the tape")
                valid = False
                return valid
            else:
                pointer -= 1
        # increment
        elif a == '+':
            if tape[pointer] == 255:
                tape[pointer] = 0
            else:
                tape[pointer] += 1
        # decrement
        elif a == '-':
            if tape[pointer] == 0:
                tape[pointer] = 255
            else:
                tape[pointer] -= 1
        # output character
        elif a == '.':
            t = chr(tape[pointer])
            results += t
            print(t, end='')
        # input character
        elif a == ',':
            tape[pointer] = ord(sys.stdin.read(1))
        # opening bracket
        elif a == '[':
            if tape[pointer] == 0:
                pointer = findmatchingclosingbracket(pointer)
        # closing bracket
        elif a == ']':
            if tape[pointer] != 0:
                pointer = findmatchingopeningbracket(counter)
        counter += 1
        """
        for b in tape:
            if b != 0:
                print(b)
        """





brainfuckintepreter('++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.')

Edit:

I changed my code after some revisions, but same problem.


Solution

  • Your loops are the problem.

    level = 0
    while level > 0:
        ...
    

    That loop will never be entered. The condition is immediately false (you're setting level to 0, right before checking if it is greater than 0).

    You could change that to a do..while loop instead of a while loop (make a while true loop and check the condition at the end to decide whether to break out of the loop or not) and start checking at the current pointer position (include the current [ or ]), not at the next character after it.

    Also here:

    if tape[pointer] == 0:
            pointer = findmatchingclosingbracket(pointer)
    

    you should be passing and updating the program counter, not the tape pointer on the second line. And likewise for the other one just below it.