Ejemplo n.º 1
0
 def __init__(self, afd, secuencia_caracteres, svg_file):
     """
     @type afd  : Automata
     @param afd : automata apartir del cual se realiza al simulación
     
     @type secuencia_caracteres  : String
     @param secuencia_caracteres : representa a la cadena de caracteres
                                 a ser utilizados en la simulación.
                                 
     @type svg_file  : String
     @param svg_file : nombre del archivo de salida
     """
     self.afd =  afd
     self.svg = SVGManager(svg_file)
     #se construye el grafico apartir del afd
     self.svg.gen_svg_from_automata(afd)
     #se procesa el afd
     self.svg.load_nodes()
     #se construye la tabla de transiciones apartir del afd
     self.tabla_transiciones = TablaTransiciones(afd)
     self.tabla_transiciones.build_table()
     #estados que representaran las transiciones
     self.estado_origen = self.afd.get_estado_inicial()
     self.estado_destino = None
     self.estado_anterior = {}
     #el indice del caracter acualtmente procesado
     self.simbol_index = -1
     self.secuencia_caracteres = secuencia_caracteres
Ejemplo n.º 2
0
class SimuladorAFD :
    
    def __init__(self, afd, secuencia_caracteres, svg_file):
        """
        @type afd  : Automata
        @param afd : automata apartir del cual se realiza al simulación
        
        @type secuencia_caracteres  : String
        @param secuencia_caracteres : representa a la cadena de caracteres
                                    a ser utilizados en la simulación.
                                    
        @type svg_file  : String
        @param svg_file : nombre del archivo de salida
        """
        self.afd =  afd
        self.svg = SVGManager(svg_file)
        #se construye el grafico apartir del afd
        self.svg.gen_svg_from_automata(afd)
        #se procesa el afd
        self.svg.load_nodes()
        #se construye la tabla de transiciones apartir del afd
        self.tabla_transiciones = TablaTransiciones(afd)
        self.tabla_transiciones.build_table()
        #estados que representaran las transiciones
        self.estado_origen = self.afd.get_estado_inicial()
        self.estado_destino = None
        self.estado_anterior = {}
        #el indice del caracter acualtmente procesado
        self.simbol_index = -1
        self.secuencia_caracteres = secuencia_caracteres
   
    def next_state(self): 
        """
        Este metodo realiza la transicion de un estado origen al siguiente
        estado mediante el simbolo de transición especificado por el 
        caracter actual del la secuencia de caracteres.
        
        @rtype  : Boolean
        @return : True si se pudo realizar la transición, en caso contrario
                  retorna False
        """
        #si es el estado inicial se pinta unicamente ese estado
        if self.simbol_index == -1 :
            #print self.svg.svg_file_name
            self.svg.set_node_color(self.estado_origen.id)
            self.svg.write_svg()
            self.simbol_index += 1
            #print self.estado_origen
            
        elif self.simbol_index  >= 0 and \
            self.simbol_index < len(self.secuencia_caracteres): 
            
            self.__next_state()
        else :
            return False
        
        return True
    
    def previous_state(self): 
        """
        Este metodo realiza la transición de un estado origen al estado 
        que fue procesado anteriormente.
        
        @rtype  : Boolean
        @return : True si se pudo realizar la transición, en caso contrario
                  retorna False
        """
        if self.simbol_index >= 0: 
            
            self.__previous_state()
        else :
            return False
        
        return True
            
    def __next_state(self):  
        """
        Este metodo realiza la transicion de un estado origen al siguiente
        estado mediante el simbolo de transición especificado por el 
        caracter actual del la secuencia de caracteres.
        """
        #se obiente el siguiente caracter
        caracter = self.secuencia_caracteres[self.simbol_index]
        #se establece el estado anterior
        self.estado_anterior[str(self.simbol_index)] =  self.estado_origen
        #se obiene el estado destino resultante de la transicion 
        #producida por el simbolo caracter del estado origen
        id = self.estado_origen.id + caracter
        self.estado_destino = self.tabla_transiciones.get_table_value(id)
        #si el estado destino es None ocurrio un error
        if self.estado_destino != None :
            #se reestablece el color del estado origen
            self.svg.set_node_color(self.estado_origen.id, "none")
            #se resalta el color del estado destino
            self.svg.set_node_color(self.estado_destino.id)
            #se actulaiza el svg
            self.svg.write_svg()
            #el estado origen pasa a ser el estado actualmente procesado
            #el estado destino
            self.estado_origen = self.estado_destino
        else :
            #si ocurrio un error se reslata en rojo el color del estado
            #actual
            self.svg.set_node_color(self.estado_origen.id, "#FF0000")
            #se actualiza el svg
            self.svg.write_svg()
        
        self.simbol_index+=1
        
    def __previous_state(self):
        """
        Este metodo realiza la transición de un estado origen al estado 
        que fue procesado anteriormente.
        """
        if (self.simbol_index - 1) >= 0 :
            self.svg.set_node_color(self.estado_origen.id,"none")
            id = str(self.simbol_index - 1)
            if self.estado_anterior.has_key(id) :
                self.simbol_index -= 1
                self.svg.set_node_color(self.estado_anterior[id].id)
                self.estado_origen = self.estado_anterior[id]
            #se actualiza el indice
            
            #se actualiza el svg
            self.svg.write_svg()