Проблема разбора скобок Brainfuck в Python - PullRequest
0 голосов
/ 24 августа 2018

Я делаю компилятор для Brainfuck в Python, как практика с языком. Большинство символов не было слишком сложной задачей, но я абсолютно озадачен [ и ].

Вот что у меня есть

global cells
global pointer
cells = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
pointer = 0

#bfcode = list(input())
bfcode = list("+x+++,[>++++<-]>.")
for i in range(len(bfcode)):
    if(bfcode[i] == "."):
        print(cells[pointer])
    elif(bfcode[i] == ","):
        charin = list(input("Write one character: "))[0]
        cells[pointer] = ord(charin)
    elif(bfcode[i] == "+"):
        cells[pointer] += 1
    elif(bfcode[i] == "-"):
        cells[pointer] -= 1
    elif(bfcode[i] == ">"):
        pointer += 1
    elif(bfcode[i] == "<"):
        pointer -= 1
    elif(bfcode[i] == "["):
        print("PLACEHOLDER")
    elif(bfcode[i] == "]"):
        print("PLACEHOLDER")
    else:
        print("Non-brainfuck character detected")
    print(cells)

Итак, как новичок в Python, мой первый инстинкт - как-то вернуться в цикл for, но из того, что я могу сказать, это невозможно в Python. Я гуглил решения для того, чтобы вернуться назад в цикле, но все они сейчас находятся за пределами моего понимания ...

Есть ли простой способ вернуться назад в цикле for, который я как-то пропустил? Или, может быть, есть более простой способ сделать все это вместе?

Другие советы и предложения для моего кода также приветствуются, так как я все еще учусь:)

1 Ответ

0 голосов
/ 24 августа 2018

Вот что я сделал:

elif ins == '[':
                # only does stuff if memory isnt zero
                if mem[ptr] == 0:
                    # initialistation
                    count = 0
                    ic += 1
                    # keeps going until the end of the program
                    while ic <= len(self.prg):
                        # sets instruction
                        ins = self.prg[ic]
                        # if has found the matching bracket, it ends
                        if ins == ']' and count == 0:
                            break
                        # deals with nested loops
                        elif ins == '[':
                            count += 1
                        elif ins == ']':
                            count -= 1
                        # moves forward one place in the program
                        ic += 1
            # its an algorithim, dont ask
            elif ins == ']':
                # only does stuff if memory is zero
                if mem[ptr] != 0:
                    # initialistation
                    count = 0
                    ic -= 1
                    # keeps going until the end of the program
                    while ic >= 0:
                        # sets instruction
                        ins = self.prg[ic]
                        # if has found the matching bracket, it ends
                        if ins == '[' and count == 0:
                            break
                        # deals with nested loops
                        elif ins == ']':
                            count += 1
                        elif ins == '[':
                            count -= 1
                        # moves backward one place in the program
                        ic -= 1

Возможно, он не использует ту же структуру, что и вы, но должен дать вам несколько идей.

Короче говоря, вы перебираете код,добавление единицы при поиске открытой скобки и вычитание одной при обнаружении закрывающей скобки, чтобы найти соответствующую закрывающую скобку.

...