es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿La lista no tiene elementos para sacar, sin embargo, había algo allí?

Tratando de hacer un intérprete de Brainfuck en Python desde cero solo por diversión, ya casi he terminado el código, sin embargo, aparece este pequeño error cada vez que intento interpretar “,[>++++<]”, lo cual se supone que debe ingresar un número y multiplicarlo por 4. Se detiene y obtiene este error
python
Archivo “.\bfInterpreter.py”, línea 42, en endWhile
if self.stack[self.pointer]: self.place = self.inWhile.pop(-1)
IndexError: pop de una lista vacía

¿Alguna idea?

Aquí está el código en el que se encuentra el error:

import sys
import time

class Operador:
    def __init__(self) -> None:
        self.pointer = 0
        self.place = 0
        self.inWhile = []
        self.stack = [0]

    def plus(self):
        self.stack[self.pointer]+=1

    def minus(self):
        self.stack[self.pointer]-=1

    def left(self):
        if self.pointer > 0: self.pointer -= 1
        else: raise IndexError

    def right(self):
        self.pointer += 1
        try: self.stack[self.pointer] = 0
        except: self.stack.append(0)

    def output(self):
        print(ascii(self.stack[self.pointer])) 

    def inp(self):
        val = input("Número: ")
        try: self.stack[self.pointer] = int(val)
        except: 
            print("Por favor ingrese un número")
            self.inp()

    def startWhile(self, bf):
        self.inWhile.append(self.place)
        print(self.inWhile)

    def endWhile(self):
        print(self.inWhile)
        if self.stack[self.pointer]: self.place = self.inWhile.pop(-1)

    def interpret(self, bf):
        self.place = 0
        while self.place < len(bf):
            if bf[self.place] == "+": self.plus()
            elif bf[self.place] == "-": self.minus()
            elif bf[self.place] == "<": self.left()
            elif bf[self.place] == ">": self.right()
            elif bf[self.place] == "[": self.startWhile(bf)
            elif bf[self.place] == "]": self.endWhile()
            elif bf[self.place] == ",": self.inp()
            elif bf[self.place] == ".": self.output()
            else: raise SyntaxError
            self.place += 1
        print(self.stack)

def main():
    start = time.time()
    op = Operador()
    op.interpret(",[>++++<]")
    print(f"Terminado en {time.time() - start} segundo(s)")

if __name__ == "__main__": main()

Edit: self.stack es básicamente la memoria a la que Brainfuck tiene acceso y puede editar, por lo que “[” inicia un bucle while, verificando si un lugar determinado en la pila ha alcanzado 0 cada ciclo, y si no es 0, repite el código entre paréntesis.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el método endWhile. IndexError se genera cuando se intenta extraer de una lista vacía. Esto significa que la lista inWhile está vacía cuando se intenta extraer de ella.

    Parece que el método startWhile no está siendo llamado antes del método endWhile. Asegúrate de que el método startWhile sea llamado antes del método endWhile. También puedes agregar una verificación para asegurarte de que la lista inWhile no esté vacía antes de intentar extraer de ella.

Comments are closed.