public override object Numerar(ref LinkedList <Nodo> listaNodos, ref int n) { Terminal epsilon = new Terminal(Terminal.Tipo.EPSILON, "ε"); if (Estructura1 is Terminal term) { n1 = new Nodo(n++); n2 = new Nodo(n++); Transicion tra1 = new Transicion(epsilon, n2); n1.Transiciones.AddLast(tra1); n3 = new Nodo(n++); Transicion tra2 = new Transicion(term, n3); n2.Transiciones.AddLast(tra2); Transicion tra3 = new Transicion(epsilon, n2); n3.Transiciones.AddLast(tra3); n4 = new Nodo(n++); Transicion tra4 = new Transicion(epsilon, n4); n3.Transiciones.AddLast(tra4); Transicion tra5 = new Transicion(epsilon, n4); n1.Transiciones.AddLast(tra5); this.SetFirst(n1); this.SetLast(n4); listaNodos.AddLast(n1); listaNodos.AddLast(n2); listaNodos.AddLast(n3); listaNodos.AddLast(n4); } else { n1 = new Nodo(n++); Estructura1.Numerar(ref listaNodos, ref n); n2 = Estructura1.GetFirst(); Transicion tra1 = new Transicion(epsilon, n2); n1.Transiciones.AddLast(tra1); n3 = Estructura1.GetLast(); Transicion tra2 = new Transicion(epsilon, n2); n3.Transiciones.AddLast(tra2); n4 = new Nodo(n++); Transicion tra4 = new Transicion(epsilon, n4); n3.Transiciones.AddLast(tra4); Transicion tra5 = new Transicion(epsilon, n4); n1.Transiciones.AddLast(tra5); this.SetFirst(n1); this.SetLast(n4); } return(null); }
public override object Numerar(ref LinkedList <Nodo> listaNodos, ref int n) { if (Estructura1 is Terminal term1) { //.ab if (Estructura2 is Terminal term2) { n1 = new Nodo(n++); n2 = new Nodo(n++); Transicion tra1 = new Transicion(term1, n2); n1.Transiciones.AddLast(tra1); n3 = new Nodo(n++); Transicion tra2 = new Transicion(term2, n3); n2.Transiciones.AddLast(tra2); this.SetFirst(n1); this.SetLast(n3); listaNodos.AddLast(n1); listaNodos.AddLast(n2); listaNodos.AddLast(n3); } //.a.bc else { n1 = new Nodo(n++); Estructura2.Numerar(ref listaNodos, ref n); n2 = Estructura2.GetFirst(); Transicion tra1 = new Transicion(term1, n2); n1.Transiciones.AddLast(tra1); this.SetFirst(n1); this.SetLast(Estructura2.GetLast()); listaNodos.AddLast(n1); } } else { Estructura1.Numerar(ref listaNodos, ref n); n2 = Estructura1.GetLast(); //..abc if (Estructura2 is Terminal term2) { n3 = new Nodo(n++); Transicion tra = new Transicion(term2, n3); n2.Transiciones.AddLast(tra); this.SetFirst(Estructura1.GetFirst()); this.SetLast(n3); listaNodos.AddLast(n3); } //..ab.cd else { Estructura2.Numerar(ref listaNodos, ref n); Terminal epsilon = new Terminal(Terminal.Tipo.EPSILON, "ε"); n3 = Estructura2.GetFirst(); Transicion tra = new Transicion(epsilon, n3); n2.Transiciones.AddLast(tra); this.SetFirst(Estructura1.GetFirst()); this.SetLast(Estructura2.GetLast()); } } return(null); }
/* Declaracion_ER: Guarda en la tabla de simbolos un objeto de tipo Estructura. */ public void Declaracion_ER(string id) { Parea(Token.Tipo.S_FLECHA); try { //Se crea una ListaTerminales que se va llenando conforme se encuentra un terminal en Estructura_P. //Se crea una ListaTerminales que contiene las transiciones con el valor real para que se pueda alcanzar cierto estado. LinkedList <Terminal> ListaTerminales = new LinkedList <Terminal>(); //Se crea un ListaNodos que se va llenando conforme se realiza el AFN. LinkedList <Nodo> ListaNodos = new LinkedList <Nodo>(); //Se crea un nuevo objeto estructura. Estructura estructura = Estructura(ref ListaTerminales); Parea(Token.Tipo.S_PUNTO_Y_COMA); /***************************************************** AFN *****************************************************/ int n = 0; //Creacion de nodos y sus transiciones. estructura.Numerar(ref ListaNodos, ref n); //Creacion de grafica. String CadenaGraphviz = "digraph AFN{\n" + "\trankdir=LR;\n" + "\tGraph[label = \"AFN: " + id + "\"];\n" + "\tnode [shape = circle, fontsize = 10; style = filled fillcolor=gray, color = black, fontcolor = black];\n" + "\tI [fontsize = 1; style = filled fillcolor=white, fontcolor = white, color = white];\n" + "\tI->n" + estructura.GetFirst().Numero + "[label = Io];\n"; //Graficar nodos. Nodo First = estructura.GetFirst(); First.Graficar(ref CadenaGraphviz); CadenaGraphviz += "\tn" + estructura.GetLast().Numero + "[shape = doublecircle];\n" + "}"; Graficador graficadorAFN = new Graficador("AFN_" + id); //Creacion de archivos. RutasImagenes.AddLast(graficadorAFN.graficar(CadenaGraphviz)); /***************************************************** AFD *****************************************************/ int contadorCerraduras = 0; //A LinkedList <Nodo> c0 = new LinkedList <Nodo>(First.ObtenerCerraduras().OrderBy(nodo => nodo.Numero)); Cerradura Cerradura0 = new Cerradura(c0); Cerradura0.Estado = "n" + contadorCerraduras++; LinkedList <Cerradura> Cerraduras = new LinkedList <Cerradura>(); Cerraduras.AddLast(Cerradura0); bool nuevaEntrada; //Creacion de Estados y sus transiciones. do { nuevaEntrada = false; //Dictionary<string, Cerradura> auxiliar = new Dictionary<string, Cerradura>(Cerraduras); LinkedList <Cerradura> auxiliar = new LinkedList <Cerradura>(Cerraduras); foreach (Cerradura cerradura in Cerraduras) { if (!cerradura.Evaluado) { //a (terminal con el que se trabaja Mover). foreach (Terminal terminal in ListaTerminales) { //M(A,a) (mover). LinkedList <Nodo> Mover = new LinkedList <Nodo>(); foreach (Nodo elementoCerradura in cerradura.Elementos) { elementoCerradura.ObtenerMover(ref Mover, terminal.GetRepresentacion()); } if (Mover.Count != 0) { //C(M(A,a)) (cerradura del mover) LinkedList <Nodo> cm = new LinkedList <Nodo>(); foreach (Nodo elementoMover in Mover) { cm = new LinkedList <Nodo>(cm.Union(elementoMover.ObtenerCerraduras())); } cm = new LinkedList <Nodo>(cm.OrderBy(nodo => nodo.Numero)); bool existe = false; //Recorre el diccionario revisando si ya existe un estado igual para agregar la nueva transición. int tamano = cm.Count; foreach (Cerradura estado in auxiliar) { bool iguales = false; if (estado.Elementos.Count == cm.Count) { iguales = true; for (int i = 0; i < tamano; i++) { if (estado.Elementos.ElementAt(i).Numero != cm.ElementAt(i).Numero) { existe = false; iguales = false; break; } } if (iguales) { TransicionC transicion = new TransicionC(terminal, estado); cerradura.ListaTransiciones.AddLast(transicion); existe = true; break; } } } //Si no existe ese estado, se crea y se agrega a la lista de cerraduras auxiliar. if (!existe) { Cerradura CerraduraMover = new Cerradura(cm); CerraduraMover.Estado = "n" + contadorCerraduras++; auxiliar.AddLast(CerraduraMover); TransicionC transicion = new TransicionC(terminal, CerraduraMover); cerradura.ListaTransiciones.AddLast(transicion); nuevaEntrada = true; } } } cerradura.Evaluado = true; } } Cerraduras = auxiliar; } while (nuevaEntrada); CadenaGraphviz = "digraph AFD{\n" + "\trankdir=LR;\n" + "\tGraph[label = \"AFD: " + id + "\" fontcolor = dodgerblue4];\n" + "\tnode [shape = circle, fontsize = 10; colorscheme = pubu9, style = filled, fillcolor = 5, color = 6, fontcolor = 1];\n" + "\tI [fontsize = 1; style = filled fillcolor=white, fontcolor = white, color = white];\n" + "\tI->n0[label = Io, colorscheme = pubu9, color = 9, fontcolor = 9];\n"; //Tablas String ruta = Path.GetDirectoryName(Application.ExecutablePath); string carpeta = ruta + "\\Tablas"; if (!Directory.Exists(carpeta)) { Directory.CreateDirectory(carpeta); } ruta = carpeta; ruta += "\\Transiciones_" + id + ".pdf"; Document document = new Document(PageSize.LETTER, 10, 10, 10, 10); PdfWriter pw = PdfWriter.GetInstance(document, new FileStream(ruta, FileMode.Create)); document.Open(); Paragraph encabezado = new Paragraph("Tabla de transiciones de \"" + id + "\""); encabezado.Alignment = Element.ALIGN_CENTER; document.Add(encabezado); PdfPTable tabla = new PdfPTable(ListaTerminales.Count + 1); tabla.AddCell(""); foreach (Terminal terminal in ListaTerminales) { tabla.AddCell(terminal.GetRepresentacion()); } foreach (Cerradura estado in Cerraduras) { string nombreCelda = estado.Estado; if (estado.Elementos.Contains(estructura.GetLast())) { estado.Aceptacion = true; nombreCelda += "*"; } estado.Graficar(ref CadenaGraphviz); tabla.AddCell(nombreCelda); estado.Tablear(ref tabla, ListaTerminales); } CadenaGraphviz += "}"; document.Add(tabla); document.Close(); MessageBox.Show("Se ha creado un archivo mostrando la tabla de transiciones de " + id + " en:\n" + ruta + "\n"); Graficador graficadorAFD = new Graficador("AFD_" + id); //Creacion de archivos. RutasImagenes.AddLast(graficadorAFD.graficar(CadenaGraphviz)); //Se vincula el objeto Cerradura a un objeto simbolo que se agrega a la tablaSimbolos. Simbolo simbolo = new Simbolo(id, "Estado", Cerraduras.ElementAt(0)); //Es agregado el nuevo simbolo con su 'key' que es utilizado para evitar variables con el mismo nombre. try { tablaSimbolos.Add(id, simbolo); } catch (ArgumentException) { Console.WriteLine("Ya existe un objeto con ID = " + id); } } catch (NullReferenceException) { //Error sintactico. Manejado en Estructura. } }