Пример #1
0
        public void Validacion_ER(string id)
        {
            Parea(Token.Tipo.S_DOS_PUNTOS);
            string lexema = tokenActual.GetValor();

            lexema = lexema.Remove(0, 1);
            lexema = lexema.Remove(lexema.Length - 1, 1);
            int filaInicio    = tokenActual.GetFila();
            int columnaInicio = tokenActual.GetColumna() + 1;

            Parea(Token.Tipo.CADENA);
            Parea(Token.Tipo.S_PUNTO_Y_COMA);
            //Aqui continua la validacion del lexema.
            consola += "**Evaluando Expresion Regular: " + id + "**\n";
            try
            {
                Simbolo simbolo = tablaSimbolos[id];    //Posible Exception.
                if (!simbolo.GetTipo().Equals("Estado"))
                {
                    throw new KeyNotFoundException();   //Como no es compatible el tipo entonces no se puede trabajar con él. Se manda Exception.
                }
                Cerradura estado   = (Cerradura)simbolo.GetValor();
                int       contador = 0;
                if (estado.Validar(lexema, ref contador, ref filaInicio, ref columnaInicio, ref ListaTokensAnalizados))
                {
                    consola += "El lexema: \"" + lexema + "\", es válido para la Expresion Regular: " + id + "\n";
                }
                else
                {
                    consola += "El lexema: \"" + lexema + "\", no es válido para la Expresion Regular: " + id + "\n";
                }
            }
            catch (KeyNotFoundException)
            {
                consola += "No se pudo validar el lexema: " + lexema + ", no se encontró su expresión regular\n**Fin evaluacion**\n";
            }
        }
Пример #2
0
 public TransicionC(Terminal terminal, Cerradura next)
 {
     Terminal        = terminal;
     EstadoSiguiente = next;
     Graficado       = false;
 }
Пример #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.
     }
 }