def testDadoUmAFAposAplicarFechamentoPositivoNoMesmoOEstadoInicialSohEhFinalSeJaEraFinalAntes(self): afd1 = construirAFDComABOndeBsEhImpar() afd2 = construirAFDComABOndeAsEhPar() self.assertFalse(afd1.obterEstadoInicial().ehFinal()) self.assertTrue(afd2.obterEstadoInicial().ehFinal()) afd_pos1 = util.obter_fechamento_positivo_af(afd1) afd_pos2 = util.obter_fechamento_positivo_af(afd2) self.assertFalse(afd_pos1.obterEstadoInicial().ehFinal()) self.assertTrue(afd_pos2.obterEstadoInicial().ehFinal())
def testDadoUmAFPodeAplicarFechamentoPositivoNoMesmo(self): afd1 = construirAFDQueGeraOSimboloA() afd_pos = util.obter_fechamento_positivo_af(afd1) self.assertEqual(len(afd_pos.obterEstados()), len(afd1.obterEstados())) self.assertFalse(util.sao_equivalentes_af(afd1, afd_pos)) self.assertTrue(afd1.reconhecePalavra('a')) self.assertFalse(afd1.reconhecePalavra('aa')) self.assertTrue(afd_pos.reconhecePalavra('aa')) self.assertTrue(afd_pos.reconhecePalavra('aaa')) self.assertTrue(afd_pos.reconhecePalavra('a')) self.assertFalse(afd_pos.reconhecePalavra(EPSILON))
def __constroi_automato(self, exp_reg): if(self.__ehOperador(exp_reg[0])): msg = 'Expressao mal formada, esperando um simbolo mas encontrou um operador[{0}]' msg = msg.format(exp_reg[0]) raise ErroConstruindoAFD(msg) if(exp_reg[0] == ')'): msg = 'Expressao mal formada, esperando um simbolo mas encontrou )' raise ErroConstruindoAFD(msg) if(exp_reg[0] == '('): i = self.__obterIndiceDoEncerramentoDoPrimeiroParentesis(exp_reg) sub = exp_reg[1:i] #De depois do ( ateh antes do ) exp_reg = exp_reg[i+1:] #De depois do ) ate o final da string. automato = self.__constroi_automato(sub) if(exp_reg == ''): return automato else: if(exp_reg[0] == EPSILON): automato = util.gerar_automato_finito_epsilon() else: automato = util.gerar_automato_finito(exp_reg[0]) exp_reg = exp_reg[1:] if(exp_reg == ''): return automato if(exp_reg[0] == ExpressaoRegular.operadorFechamentoReflexivo): automato = util.obter_fechamento_reflexivo_af(automato) exp_reg = exp_reg[1:] if(exp_reg == ''): return automato if(exp_reg[0] == ExpressaoRegular.operadorFechamentoPositivo): automato = util.obter_fechamento_positivo_af(automato) exp_reg = exp_reg[1:] if(exp_reg == ''): return automato if(exp_reg[0] == ExpressaoRegular.operadorInterrogacao): epsilon = util.gerar_automato_finito_epsilon() automato = util.unir_af(automato, epsilon) exp_reg = exp_reg[1:] if(exp_reg == ''): return automato if(exp_reg[0] == ExpressaoRegular.operadorOU): return util.unir_af(automato, self.__constroi_automato(exp_reg[1:])) if(exp_reg[0] == ExpressaoRegular.operadorE): return util.concatenar_af(automato, self.__constroi_automato(exp_reg[1:])) return util.concatenar_af(automato, self.__constroi_automato(exp_reg))