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); }
public void GenerarAFN(Expresiones_Regulares expresion) { this.expresion = expresion; bool suma = true; Token token1; List <Token> nuevaER = expresion.GetTokens().ToList(); List <Token> auxiliar = new List <Token>(); foreach (var item in nuevaER) { if (item.GetTipoToken() == Token.Tipo.LLAVE_APERTURA || item.GetTipoToken() == Token.Tipo.LLAVE_CIERRE) { } else { auxiliar.Add(item); } } nuevaER = auxiliar; while (suma) { for (int i = 0; i < nuevaER.Count; i++) { token1 = nuevaER.ElementAt(i); if (token1.GetTipoToken() == Token.Tipo.OP_SUMA) { suma = true; break; } else { suma = false; } } if (suma) { nuevaER = SustituirCerraduraPositiva(nuevaER); } } foreach (var item in nuevaER) { Console.WriteLine(item.GetValorToken()); } //AFN inicial = Operando("epsilon"); for (int i = nuevaER.Count - 1; i >= 0; i--) { GenerarThompson(nuevaER.ElementAt(i)); } //ORDENANDO LOS ESTADOS AFN final = stackAFN.Pop(); int contadorEst = 1; //final = Concatenacion(inicial, final); //stackAFN.Push(final); final.Inicial.SetNumeroEstado(0); foreach (var item in final.GetListaEstados()) { item.SetNumeroEstado(contadorEst); contadorEst++; } final.Final.SetNumeroEstado(contadorEst); stackAFN.Push(final); foreach (var token in nuevaER) { switch (token.GetTipoToken()) { case Token.Tipo.PUNTO: //CONCATENACION { break; } case Token.Tipo.PALITO_OR: //ALTERNANCIA { break; } case Token.Tipo.ASTERISCO: //CERRADURA DE KLEEN { break; } case Token.Tipo.OP_SUMA: //CERRADURA POSITIVA { break; } case Token.Tipo.PREGUNTA_CIERRE: //APARICION { break; } default: { //operando if (!final.listaTerminales.Contains(token.GetValorToken())) { final.listaTerminales.Add(token.GetValorToken()); } break; } } } }