public void construirAFN(string exprecionPostfija) { foreach (char caracter in exprecionPostfija) { if (caracter == '*')//(unario) { cerraduraKleenAFN(); } else if (caracter == '+')//(unario) { cerraduraPositivaAFN(); } else if (caracter == '?')//(unario) { ceroUnaInstanciaAFN(); } else if (caracter == '|')//Union de automatas (binario) { unionAFN(); } else if (caracter == '&')//Concatenacion de automatas (binario) { concatenaAFN(); } else { AFN nuevo = new AFN(); nuevo.automataSimple(caracter.ToString()); pilaR.Add(nuevo); } } }
public void obtenConjuntos(string exprecion) { string lenguaje2 = exprecion.Replace("&", ""); lenguaje2 = lenguaje2.Replace("|", ""); lenguaje2 = lenguaje2.Replace("?", ""); lenguaje2 = lenguaje2.Replace("+", ""); lenguaje2 = lenguaje2.Replace("*", ""); lenguaje2 += "ε"; var lenguajetemp = new HashSet <char>(lenguaje2); AFN lastAFN = pilaR[0]; foreach (Edo unEstado in lastAFN.LEstados) { foreach (char unCaracter in lenguajetemp) { List <int> temp = new List <int>(); foreach (Transicion unaTransicion in lastAFN.LTransiciones) { if (unaTransicion.etiqueta == unCaracter.ToString()) { if (unEstado.id == unaTransicion.origen.id) { temp.Add(unaTransicion.destino.id); } } } unEstado.conjuntoRelaciones.Add(temp); } } }
public void ceroUnaInstanciaAFN() { int topePila = pilaR.Count - 1; AFN tope = pilaR[topePila]; AFN nuevo = new AFN(tope, null, "?"); pilaR.RemoveAt(topePila); pilaR.Add(nuevo); }
public void cerraduraPositivaAFN() { int topePila = pilaR.Count - 1; AFN tope = pilaR[topePila]; AFN nuevo = new AFN(tope, null, "+"); pilaR.RemoveAt(topePila); pilaR.Add(nuevo); }
void concatenaAFN() { int topePila = pilaR.Count - 1; AFN derecha = pilaR[topePila]; AFN izquierda = pilaR[topePila - 1]; AFN nuevo = new AFN(izquierda, derecha, "concatenacion"); pilaR.RemoveAt(topePila); pilaR.RemoveAt(topePila - 1); pilaR.Add(nuevo); }
public AFN(AFN izquierda, AFN derecha, string accion) { LEstados = new List <Edo>(); LTransiciones = new List <Transicion>(); if (accion == "*") { Edo inicio = new Edo(); Edo aceptacion = new Edo(); inicio.tipo = "Comienzo"; aceptacion.tipo = "Aceptacion"; foreach (Edo e in izquierda.LEstados) { if (e.tipo == "Comienzo") { inicio = e; } else if (e.tipo == "Aceptacion") { aceptacion = e; } } Transicion paTraz = new Transicion(); paTraz.origen = aceptacion; paTraz.destino = inicio; this.LTransiciones.Add(paTraz); inicio = new Edo(); aceptacion = new Edo(); inicio.tipo = "Comienzo"; aceptacion.tipo = "Aceptacion"; Transicion epcilon = new Transicion(); epcilon.origen = inicio; epcilon.destino = aceptacion; this.LTransiciones.Add(epcilon); foreach (Edo e in izquierda.LEstados) { if (e.tipo == "Comienzo") { Transicion nuevaPrincipio = new Transicion(); nuevaPrincipio.origen = inicio; nuevaPrincipio.destino = e; e.tipo = "Inicio"; this.LTransiciones.Add(nuevaPrincipio); } else if (e.tipo == "Aceptacion") { Transicion nuevaFinal = new Transicion(); nuevaFinal.destino = aceptacion; nuevaFinal.origen = e; e.tipo = "Inicio"; this.LTransiciones.Add(nuevaFinal); } } this.LEstados.Add(inicio); this.LEstados.Add(aceptacion); this.LTransiciones.AddRange(izquierda.LTransiciones); this.LEstados.AddRange(izquierda.LEstados); } if (accion == "+") { Edo inicio = new Edo(); Edo aceptacion = new Edo(); inicio.tipo = "Comienzo"; aceptacion.tipo = "Aceptacion"; foreach (Edo e in izquierda.LEstados) { if (e.tipo == "Comienzo") { inicio = e; } else if (e.tipo == "Aceptacion") { aceptacion = e; } } Transicion paTraz = new Transicion(); paTraz.origen = aceptacion; paTraz.destino = inicio; this.LTransiciones.Add(paTraz); inicio = new Edo(); aceptacion = new Edo(); inicio.tipo = "Comienzo"; aceptacion.tipo = "Aceptacion"; foreach (Edo e in izquierda.LEstados) { if (e.tipo == "Comienzo") { Transicion nuevaPrincipio = new Transicion(); nuevaPrincipio.origen = inicio; nuevaPrincipio.destino = e; e.tipo = "Inicio"; this.LTransiciones.Add(nuevaPrincipio); } else if (e.tipo == "Aceptacion") { Transicion nuevaFinal = new Transicion(); nuevaFinal.destino = aceptacion; nuevaFinal.origen = e; e.tipo = "Inicio"; this.LTransiciones.Add(nuevaFinal); } } this.LEstados.Add(inicio); this.LEstados.Add(aceptacion); this.LTransiciones.AddRange(izquierda.LTransiciones); this.LEstados.AddRange(izquierda.LEstados); } if (accion == "?") { Edo inicio = new Edo(); Edo aceptacion = new Edo(); inicio.tipo = "Comienzo"; aceptacion.tipo = "Aceptacion"; Transicion epcilon = new Transicion(); epcilon.origen = inicio; epcilon.destino = aceptacion; this.LTransiciones.Add(epcilon); foreach (Edo e in izquierda.LEstados) { if (e.tipo == "Comienzo") { Transicion nuevaPrincipio = new Transicion(); nuevaPrincipio.origen = inicio; nuevaPrincipio.destino = e; e.tipo = "Inicio"; this.LTransiciones.Add(nuevaPrincipio); } else if (e.tipo == "Aceptacion") { Transicion nuevaFinal = new Transicion(); nuevaFinal.destino = aceptacion; nuevaFinal.origen = e; e.tipo = "Inicio"; this.LTransiciones.Add(nuevaFinal); } } this.LEstados.Add(inicio); this.LEstados.Add(aceptacion); this.LTransiciones.AddRange(izquierda.LTransiciones); this.LEstados.AddRange(izquierda.LEstados); } if (accion == "union") { Edo inicio = new Edo(); Edo aceptacion = new Edo(); inicio.tipo = "Comienzo"; aceptacion.tipo = "Aceptacion"; foreach (Transicion t in derecha.LTransiciones) { this.LTransiciones.Add(t); } foreach (Edo e in derecha.LEstados) { this.LEstados.Add(e); } foreach (Transicion t in izquierda.LTransiciones) { this.LTransiciones.Add(t); } foreach (Edo e in izquierda.LEstados) { this.LEstados.Add(e); } foreach (Edo e in this.LEstados) { if (e.tipo == "Comienzo") { Transicion nuevaPrincipio = new Transicion(); nuevaPrincipio.origen = inicio; nuevaPrincipio.destino = e; e.tipo = "Inicio"; this.LTransiciones.Add(nuevaPrincipio); } else if (e.tipo == "Aceptacion") { Transicion nuevaFinal = new Transicion(); nuevaFinal.destino = aceptacion; nuevaFinal.origen = e; e.tipo = "Inicio"; this.LTransiciones.Add(nuevaFinal); } } this.LEstados.Add(inicio); this.LEstados.Add(aceptacion); } if (accion == "concatenacion") { LEstados = new List <Edo>(); LTransiciones = new List <Transicion>(); int comienzo; //busca el estado donde comiensa el automata de la derecha for (comienzo = 0; comienzo < derecha.LEstados.Count; comienzo++) { if (derecha.LEstados[comienzo].tipo == "Comienzo") { //busca las tranciciones del automata izquierdo que tengan como destino un estado de aceptacion //posteriormente si se encuentra pasan a tener un nuevo estado destino, que es el estado donde comienza el automata derecho for (int i = izquierda.LTransiciones.Count - 1; i >= 0; i--) { if (izquierda.LTransiciones[i].destino.tipo == "Aceptacion") { izquierda.LTransiciones[i].destino = derecha.LEstados[comienzo]; } } break; } } //el donde antes comenzaba el automata de la derecha ahora se convierte //en un estado de inicio mas del automata de la iquierda derecha.LEstados[comienzo].tipo = "Inicio"; //busca el estado de aceptacion del automata de la izquierda lo elimina for (int i = 0; i < izquierda.LEstados.Count; i++) { if (izquierda.LEstados[i].tipo == "Aceptacion") { izquierda.LEstados.RemoveAt(i); break; } } //agrega todos los estados de la automata de la derecha foreach (Edo e in derecha.LEstados) { this.LEstados.Add(e); } //agrega todas las transiciones del automata de la derecha foreach (Transicion t in derecha.LTransiciones) { this.LTransiciones.Add(t); } //agrega todos los estados de la automata de la izq foreach (Edo e in izquierda.LEstados) { this.LEstados.Add(e); } //agrega todas las transiciones del automata de la izquierda foreach (Transicion t in izquierda.LTransiciones) { this.LTransiciones.Add(t); } } }