private AFN Concatenacion(AFN operando1, AFN operando2) // S1 ---tran1_2--->> S2 ---tran2_3--->> S3 { //MODIFICAR TRANSICION: LOS QUE APUNTAN A ULTIMO YA NO LO HACEN Transicion cambioIzq = operando1.GetEstadoInicial().GetTransicionIzq(); Transicion cambioDer = operando1.GetEstadoInicial().GetTransicionDer(); if (cambioIzq != null && cambioIzq.GetSegundo() == operando1.GetEstadoFinal()) { cambioIzq.SetSegundoEstado(operando2.GetEstadoInicial()); } if (cambioDer != null && cambioDer.GetSegundo() == operando1.GetEstadoFinal()) { cambioDer.SetSegundoEstado(operando2.GetEstadoInicial()); } foreach (var estado in operando1.GetListaEstados()) { cambioIzq = estado.GetTransicionIzq(); cambioDer = estado.GetTransicionDer(); if (cambioIzq != null && cambioIzq.GetSegundo() == operando1.GetEstadoFinal()) { cambioIzq.SetSegundoEstado(operando2.GetEstadoInicial()); } if (cambioDer != null && cambioDer.GetSegundo() == operando1.GetEstadoFinal()) { cambioDer.SetSegundoEstado(operando2.GetEstadoInicial()); } } //LO UNICO QUE HAY QUE HACER ES UNIR EL ULTIMO DEL PRIMERO CON EL PRIMERO DEL ULTIMO operando1.Final = operando2.Inicial; AFN concatenacion = new AFN(); concatenacion.Inicial = operando1.Inicial; concatenacion.Final = operando2.Final; //METIENDO EL RESTO DE ESTADOS AFN NUMERO 1 foreach (var estado in operando1.GetListaEstados()) { concatenacion.GetListaEstados().Add(estado); } concatenacion.GetListaEstados().Add(operando1.Final); //METIENDO EL RESTO DE ESTADOS AFN NUMERO 2 foreach (var estado in operando2.GetListaEstados()) { concatenacion.GetListaEstados().Add(estado); } return(concatenacion); }
private EstadoAFD Cerradura(List <Estado> estados) { Stack <Estado> pilaEstados = new Stack <Estado>(); Estado actual; //estado AFD List <Estado> listaEstados = new List <Estado>(); List <int> numeroEstados = new List <int>(); foreach (var estado in estados) { actual = estado; pilaEstados.Push(actual); numeroEstados.Add(estado.GetNoEstado()); while (pilaEstados.Count > 0) { actual = pilaEstados.Pop(); if (actual != null) { Transicion transicion = actual.GetTransicionDer(); if (transicion != null && transicion.GetTransicionSimbolo().Equals("epsilon") && !listaEstados.Contains(transicion.GetSegundo())) { listaEstados.Add(transicion.GetSegundo()); numeroEstados.Add(transicion.GetSegundo().GetNoEstado()); pilaEstados.Push(transicion.GetSegundo()); } transicion = actual.GetTransicionIzq(); if (transicion != null && transicion.GetTransicionSimbolo().Equals("epsilon") && !listaEstados.Contains(transicion.GetSegundo())) { listaEstados.Add(transicion.GetSegundo()); numeroEstados.Add(transicion.GetSegundo().GetNoEstado()); pilaEstados.Push(transicion.GetSegundo()); } } } listaEstados.Add(estado); } EstadoAFD estadoAFD = new EstadoAFD(nombreEstadoAFD++, numeroEstados, listaEstados); if (listaEstados.Contains(automataND.GetEstadoFinal())) { estadoAFD.SetTipoEstado(EstadoAFD.Tipo.FINAL); } else { estadoAFD.SetTipoEstado(EstadoAFD.Tipo.NORMAL); } //Console.WriteLine("PRUEBA ESTADOS POR " + "epsilon"); //string alv = ""; //foreach (Estado est in listaEstados) //{ // alv += est.GetNoEstado(); //} return(estadoAFD); }