brainfuck 解释器打印错误

brainfuck intepreter printing out wrong

我最近决定尝试编写 "yet another" brainfuck 解释器,但我遇到了问题。当它应该输入我们的 hello,world! 时,它打印出错误的数字。有谁知道为什么会这样?提前致谢!我不明白为什么要这样做。请帮忙!我只是一个初学者。很抱歉糟糕的编码风格,但请不要改变整个事情。我宁愿收到小费。

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('++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.')

编辑:

经过一些修改我更改了我的代码,但同样的问题。

问题出在你的循环上。

level = 0
while level > 0:
    ...

永远不会进入那个循环。条件立即为假(您将级别设置为 0,然后再检查它是否大于 0)。

您可以将其更改为 do..while 循环而不是 while 循环(创建一个 while true 循环并检查最后的条件以决定是否跳出是否循环)并从当前指针位置(包括当前 [])开始检查,而不是在它之后的下一个字符。

也在这里:

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

您应该传递和更新程序计数器,而不是第二行的磁带指针。同样对于它下面的另一个。