コード例 #1
0
class PDA:
    def __init__(self, estadoInicial, estadoAceptacion, simboloInicial):
        self.estadoInicial = estadoInicial
        self.estadoFinal = estadoAceptacion
        self.edges = None
        self.pila = Pila()
        self.pilas = []
        self.proceso = []  # 1 para meter, 0 para sacar

        if simboloInicial != None:
            self.pila.apilar(simboloInicial)
            self.proceso.append([simboloInicial, 1, "", ""])
            print(self.pila.verTope())

    def setEdges(self, edges):
        self.edges = edges

    def buscarNodo(self, nodo):

        caminos = []  #Lista de caminos

        #Saco los posibles caminos de un punto a otro
        for w in self.edges:
            divido = w[0].split("-")
            origen = divido[0]

            if origen == nodo:
                caminos.append(w)

        return caminos

    def __caminosPosibles(self, letra, caminos):

        caminosPosibles = []

        for x in caminos:
            for i in x:

                if "-" in i:
                    caminosPosibles.append(i)
                else:
                    leo, saco, meto = extraerExpresion(i)
                    if leo == letra or leo == "λ":
                        caminosPosibles.append(i)

        return caminosPosibles

    def evaluarCadena(self, cadena, actual, pila, proceso):

        if self.edges != None:

            if (cadena == "" or cadena == "λ") and actual == self.estadoFinal:
                self.pila = pila
                self.proceso = proceso
                return True  #, listaPilas

            if cadena != "":
                letra = cadena[0]

            else:
                cadena = letra = "λ"

            actual = actual.lower()  #Nodo donde se encuentra

            caminosEncontrados = self.buscarNodo(actual)
            #Recorro todos los posibles caminos si los hay

            if caminosEncontrados != []:

                caminosEncontrados = self.__caminosPosibles(
                    letra, caminosEncontrados)

                ver = origen = destino = None
                retorno = False

                for w in caminosEncontrados:

                    if "-" in w:
                        ver = w
                        #Divido el string para saber Nodo origen a nodo destino
                        divido = ver.split("-")
                        origen = divido[0]
                        destino = divido[1]

                    #Recorro cada regla para sacar leo/saco/meto para evaluar

                    if "-" not in w:
                        leo, saco, meto = extraerExpresion(w)
                        aux = ""

                        if leo == letra or leo == "λ":

                            if saco == pila.verTope():
                                #Meto valores en la pila
                                #Si el leo y saco estan bien
                                encontroCamino = True

                                aux = pila.sacarPila()
                                proceso.append([aux, 0, w, ver])

                                for x in meto:
                                    if x != "λ":
                                        pila.apilar(x)
                                        proceso.append([x, 1, w, ver])

                                retorno = self.evaluarCadena(
                                    cadena[1:], destino, pila, proceso)

                                if retorno == False:
                                    for x in meto:
                                        if x != "λ":
                                            pila.sacarPila()
                                            proceso.pop()

                                    pila.apilar(aux)
                                    proceso.pop()

                        if retorno == True:
                            self.pila = pila
                            self.proceso = proceso
                            return retorno

                return retorno

            else:
                return False