コード例 #1
0
ファイル: afnd.py プロジェクト: TADebastiani/COMPILADORES
    def _nao_terminal(self, estado, terminal, nao_term):
        flag = False
        tem_nao_term = False
        indice = 0
        rotulo = 0

        for est in self.estados:
            if est.rotuloGr != estado:
                indice += 1
            if est.rotuloGr == nao_term:
                tem_nao_term = True
                rotulo = est.rotulo

        for prox_estado in self.estados[indice].transicoes:
            if prox_estado.rotulo == terminal:
                flag = True
                if tem_nao_term:
                    if rotulo not in prox_estado.transicoes:
                        prox_estado.transicoes.append(rotulo)
                else:
                    prox_estado.transicoes.append(self._count_estado)
                    self._add_estado(nao_term)
                break

        if not flag:
            transicao = Transicao()
            transicao.rotulo = terminal
            if tem_nao_term:
                transicao.transicoes.append(rotulo)
            else:
                transicao.transicoes.append(self._count_estado)
                self._add_estado(nao_term)
            self.estados[indice].transicoes.append(transicao)
コード例 #2
0
    def addTransicao(self, segFita, partida, destino, simboloAtual,
                     simboloNovo, movimento, nomeDoBloco, pause):
        blocoLocal = self.pegaOBloco(nomeDoBloco)

        # Adiciona simbolo no alfabeto do simulador da maquina
        if (simboloAtual not in self.alfabeto):
            self.alfabeto.append(simboloAtual)

        blocoLocal.addEstado(partida)
        blocoLocal.addEstado(destino)
        blocoLocal.addnoAlfabeto(simboloAtual)
        blocoLocal.addoutAlfabeto(simboloNovo)

        movement = ""

        if (movimento == 'e'):
            movement = Fita.MOVE_ESQUERDA
        elif (movimento == 'd'):
            movement = Fita.MOVE_DIREITA
        else:
            movement = Fita.IMOVEL

        novaTrans = Transicao(segFita, partida, destino, simboloAtual,
                              simboloNovo, movement, pause)
        blocoLocal.addTransicao(novaTrans)
        return
コード例 #3
0
def ler_arquivo(arquivo: str):
    configuracoes = json.loads(
        open(file=arquivo, mode="r", encoding="UTF-8").read())

    lugares = {}
    transicoes = {}

    for lugar_conf in configuracoes["lugares"]:
        lugar = Lugar(lugar_conf)
        lugares[lugar.id] = lugar

    for transacao_conf in configuracoes["transicoes"]:
        transicao = Transicao(transacao_conf)
        transicoes[transicao.id] = transicao

    for arco_conf in configuracoes["arcos"]:
        id_origem = arco_conf["origem"]
        id_destino = arco_conf["destino"]
        peso = arco_conf["peso"]

        if id_origem in lugares:
            origem = lugares[id_origem]
            destino = transicoes[id_destino]
        else:
            origem = transicoes[id_origem]
            destino = lugares[id_destino]

        origem.destinos.append({"peso": peso, "destino": destino})
        destino.origens.append({"peso": peso, "origem": origem})

    return {"lugares": lugares, "transicoes": transicoes}
コード例 #4
0
def uniaoA(a1):
    eIniciais = a1.getEstadosIniciais()
    eFinais = a1.getEstadosFinais()
    for final in eFinais:
        for inicial in eIniciais:
            t = Transicao(final, inicial, '')
            final.addTransicao(t)
    a1.atualizaIds()
    return a1
コード例 #5
0
ファイル: afnd.py プロジェクト: TADebastiani/COMPILADORES
    def _terminal(self, estado, terminal):
        indice = 0
        flag = False
        for est in self.estados:
            if est.rotuloGr == estado:
                break
            indice += 1

        for prox_estado in self.estados[indice].transicoes:
            if prox_estado.rotulo == terminal:
                flag = True
                prox_estado.transicoes.append(self._count_estado)

        if not flag:
            transicao = Transicao()
            transicao.rotulo = terminal
            transicao.transicoes.append(self._count_estado)

        est = self._add_estado("")
        est.final = True
コード例 #6
0
def uniaoOu(a1, a2, tag):
    novoAutomato = Automato(tag)  #Cria um novo automato
    #Adicionando todos os estados dos automatos antigos no novo
    estados1 = a1.getEstados()
    estados2 = a2.getEstados()
    for estado in estados1:
        novoAutomato.addEstado(estado)
    for estado in estados2:
        novoAutomato.addEstado(estado)
    #Criando novos estados
    novoInicial = Estado(True, False)
    novoFinal = Estado(False, True)
    novoAutomato.addEstado(novoInicial)
    novoAutomato.addEstado(novoFinal)
    novoAutomato.addEstadoInicial(novoInicial)
    novoAutomato.addEstadoFinal(novoFinal)
    #Criando novas transicoes para os estados iniciais
    iniciais1 = a1.getEstadosIniciais()
    iniciais2 = a2.getEstadosIniciais()
    for estado in iniciais1:
        t = Transicao(novoInicial, estado, '')
        novoInicial.addTransicao(t)
        estado.setInicial(False)
    for estado in iniciais2:
        t = Transicao(novoInicial, estado, '')
        novoInicial.addTransicao(t)
        estado.setInicial(False)
    #Criando novas transicoes para os estados finais
    finais1 = a1.getEstadosFinais()
    finais2 = a2.getEstadosFinais()
    for estado in finais1:
        t = Transicao(estado, novoFinal, '')
        estado.addTransicao(t)
        estado.setFinal(False)
    for estado in finais2:
        t = Transicao(estado, novoFinal, '')
        estado.addTransicao(t)
        estado.setFinal(False)
    novoAutomato.atualizaIds()
    return novoAutomato
コード例 #7
0
ファイル: modelo.py プロジェクト: als-v/Expressoes-Regulares
    def __init__(self, nome=None):
        self.letra_estado = 'q'
        self.inicio = self.letra_estado+(str(0))

        if(nome != None):
            self.lista_fim = [self.letra_estado+(str(1))]
            self.lista_estado = [self.inicio, self.lista_fim[0]]
            transicao = Transicao(self.inicio, nome, self.lista_fim[0])
            self.lista_transicao = [transicao]
            self.alfabeto = [transicao.nome]
        else:
            self.lista_estado = []
            self.lista_transicao = list()
            self.alfabeto = list()
            self.lista_fim = list()
コード例 #8
0
ファイル: maquina.py プロジェクト: ogoes/Automato-de-Pilha
    def __init__(self, dados, entrada):
        self.entrada = [entry for entry in entrada]
        self.alfabeto_entrada = dados['alfabeto_entrada']
        self.alfabeto_pilha = dados['alfabeto_pilha']
        self.epsilon = dados['epsilon']
        self.inicial_pilha = dados['inicial_pilha']
        self.estados_tmp = dados['estados']  ## nomes dos estados
        self.estado_inicial = dados['estado_inicial']
        self.estados_finais = dados['estados_finais']
        self.transicoes_tmp = dados[
            'transicoes']  ## dicts temporarios das transicoes
        #### Atribuicao dos dados simples ####

        self.estados = []
        for state in self.estados_tmp:  ## criar objetos de estado
            estado = Estado(state)
            if state == self.estado_inicial:  ## setar estado inicial
                self.estado_atual = estado
                estado.set_inicial()
            if state in self.estados_finais:  ## setar estado(s) final(is)
                estado.set_final()

            self.estados.append(estado)

        self.transicoes = []
        for transition in self.transicoes_tmp:  ## criar objetos de transicao
            for i in self.estados:
                if i.get_nome() == transition[
                        'estado_atual']:  ## atribuir estado a transicao
                    cur_state = i
                if i.get_nome() == transition[
                        'estado_destino']:  ## atribuir estado a transicao
                    new_state = i

            simbol_ent = transition['simbolo_corrente']
            simbols_stack = transition['pop_pilha']
            new_simbols_stack = transition['push_pilha']

            ## adicionar uma transicao a lista de transicoes
            self.transicoes.append(
                Transicao(cur_state, simbol_ent, simbols_stack, new_state,
                          new_simbols_stack))

        ## cria a primeira execucao
        self.execucoes = [
            Algoz(self.entrada, Pilha(self.inicial_pilha), self.estado_atual,
                  self.epsilon)
        ]
コード例 #9
0
ファイル: modelo.py プロジェクト: als-v/Expressoes-Regulares
 def addTransicao(self, origem, nome, destino):
     if isinstance(origem, int):
         origem = self.letra_estado+str(origem)
     if isinstance(destino, int):
         destino = self.letra_estado+str(destino)
     if(self.origem_destino(origem, nome, destino) == False):
         if(self.getEstado(origem) == False):
             self.addEstado(origem)
         if(self.getEstado(destino) == False):
             self.addEstado(destino)
         transicao = Transicao(origem, nome, destino)
         self.lista_transicao.append(transicao)
         if(transicao.nome != self.epsilon()):
             if(transicao.nome not in self.alfabeto):
                 self.alfabeto.append(transicao.nome)                
         return True
     return False
コード例 #10
0
def automatoSimples(simbolo, tag):
    automato = Automato(tag)  #Cria um novo automato
    eInicial = Estado(True, False)  #Cria um estado inicial
    eFinal = Estado(False, True)  #Cria um estado final
    #Adiciona os estados no automato
    automato.addEstado(eInicial)
    automato.addEstado(eFinal)
    automato.addEstadoInicial(eInicial)
    automato.addEstadoFinal(eFinal)
    transicao = Transicao(
        eInicial, eFinal,
        simbolo)  #Cria uma transicao entre o estado final e inicial
    eInicial.addTransicao(
        transicao
    )  #Adiciona a transicao na lista de transicoes do estado inicial
    automato.atualizaIds()
    return automato
コード例 #11
0
    def retira_informacoes(self):

        AUTOMATO = 0
        TRANSICOES_INIC = 2
        num_linha = 0
        transicoes = []

        for linha in self.texto_automato:
            if num_linha == AUTOMATO:
                posicao_inicial = linha.index('=') + 1
                automato = linha[posicao_inicial:]

            elif num_linha >= TRANSICOES_INIC:
                transicao = Transicao(linha.replace('\n', ''))
                transicoes.append(transicao)

            num_linha += 1

        return automato, transicoes
コード例 #12
0
def uniaoE(a1, a2, tag):
    novoAutomato = Automato(tag)  #Cria um novo automato
    #Adicionando todos os estados dos automatos antigos no novo
    estados1 = a1.getEstados()
    estados2 = a2.getEstados()
    for estado in estados1:
        novoAutomato.addEstado(estado)
    for estado in estados2:
        novoAutomato.addEstado(estado)
    #Adicionando todos os estados iniciais de a1 como estados iniciais do novo automato
    for estado in a1.getEstadosIniciais():
        novoAutomato.addEstadoInicial(estado)
    #Fazendo todos os estados finais de a1 apontarem para os estados iniciais de a2
    for estadoFinal in a1.getEstadosFinais():
        estadoFinal.setFinal(False)
        for estadoInicial in a2.getEstadosIniciais():
            estadoInicial.setInicial(False)
            t = Transicao(estadoFinal, estadoInicial, '')
            estadoFinal.addTransicao(t)
    #Adicionando todos os estados finais de a2 na lista de estados finais do novo automato
    for estadoFinal in a2.getEstadosFinais():
        novoAutomato.addEstadoFinal(estadoFinal)
    novoAutomato.atualizaIds()
    return novoAutomato
コード例 #13
0
 def _adicionaTransicao(
         self, encontrou, substitui, estadoOrigem, estadoDestino,
         direcaoFita):  #Adiciona uma transição para algum estado
     self.estados[estadoOrigem].adicionaTransicao(
         Transicao(encontrou, substitui, estadoOrigem, estadoDestino,
                   direcaoFita))