示例#1
0
        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);
        }
示例#2
0
 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);
 }
示例#3
0
 /* 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.
     }
 }