예제 #1
0
 public void separarLineas(String Lineas)
 {
     Lineas += "Ç";
     String[] lines = Lineas.Split('\n');
     foreach (var line in lines)
     {
         Leer(line);
     }
     if (listaErrores.Count != 0)
     {
         Console.WriteLine("LISTA DE ERRORES");
         foreach (var Token in listaErrores)
         {
             Console.WriteLine(Token.GetValorToken() + "<------>" + Token.GetTipoToken());
         }
     }
     if (listaTokens.Count != 0)
     {
         RecConjunto rec = new RecConjunto();
         rec.ReconocerConjuntos(listaTokens);
         listaER      = rec.GetExpresiones();
         listaCadenas = rec.GetCadenasEvaluacion();
         Console.WriteLine("LISTA DE EXPRESIONES REGULARES");
         foreach (var elementoG in listaER)
         {
             Expresiones_Regulares elemento = elementoG.Value;
             Console.WriteLine("Nombre Expresion: " + elemento.GetNombre());
             foreach (var item in elemento.GetTokens())
             {
                 Console.WriteLine("Token: " + item.GetValorToken());
             }
         }
         listaConjuntos = rec.GetConjuntos();
         Console.WriteLine("LISTA DE CONJUNTOS DECLARADOS");
         foreach (var conjunto in listaConjuntos)
         {
             Conjunto conjunto1 = conjunto.Value;
             Console.WriteLine("Nombre Conjunto: " + conjunto1.GetNombre());
             Console.WriteLine("Elementos: ");
             byte contador = 0;
             foreach (var item in conjunto1.GetElementos())
             {
                 Console.WriteLine(contador + ". " + item);
                 contador++;
             }
         }
         foreach (var Token in listaTokens)
         {
             Console.WriteLine(Token.GetValorToken() + "<------>" + Token.GetTipoToken());
         }
     }
 }
        private void EXPRESION()
        {
            Expresiones_Regulares expresion = new Expresiones_Regulares(tokenActual.GetValorToken());

            emparejar(Token.Tipo.IDENTIFICADOR);
            if (tokenActual.GetTipoToken() == Token.Tipo.GUION)
            {
                emparejar(Token.Tipo.GUION);
                emparejar(Token.Tipo.MAYOR);
                while (tokenActual.GetTipoToken() != Token.Tipo.PUNTO_COMA && dentroExpresion == true)
                {
                    expresion.AñadirElemento(tokenActual);
                    controlToken++;
                    tokenActual = listaTokens.ElementAt(controlToken);
                }
                emparejar(Token.Tipo.PUNTO_COMA);
                if (!listaER.ContainsKey(expresion.GetNombre()))
                {
                    listaER.Add(expresion.GetNombre(), expresion);
                }
            }
            else if (tokenActual.GetTipoToken() == Token.Tipo.DOS_PUNTOS)
            {
                emparejar(Token.Tipo.DOS_PUNTOS);
                while (tokenActual.GetTipoToken() != Token.Tipo.PUNTO_COMA)
                {
                    expresion.AñadirElemento(tokenActual);
                    controlToken++;
                    tokenActual = listaTokens.ElementAt(controlToken);
                }
                emparejar(Token.Tipo.PUNTO_COMA);
                if (listaER.ContainsKey(expresion.GetNombre()))
                {
                    listaCadenasEv.Add(expresion);
                }
            }
        }
예제 #3
0
        public string[] CrearAFD()
        {
            string[] hola       = new string[2];
            AFN      automataAF = stackAFN.Peek();
            AFD      automata   = new AFD(automataAF, automataAF.GetListaTerminales(), listaConjuntos);

            automata.CrearAFD();
            hola[0] = automata.GenerarGraphvizAFD();
            hola[1] = automata.GenerarGraphivizAFDTabla();
            foreach (var item in cadenas)
            {
                if (item.GetNombre().Equals(expresion.GetNombre()))
                {
                    Form1.textConsola += automata.validarCadena(item);
                }
            }
            return(hola);
        }
예제 #4
0
        public string validarCadena(Expresiones_Regulares expresionEv)
        {
            int        estadoActual   = 0;
            bool       valido         = false;
            List <int> estadosFinales = new List <int>();

            foreach (var item in mueves)
            {
                EstadoAFD estado = item.GetEstadoInicial();
                if (!estadosFinales.Contains(estado.GetNombreEstadoAFD()))
                {
                    if (estado.GetTipo() == EstadoAFD.Tipo.FINAL)
                    {
                        estadosFinales.Add(estado.GetNombreEstadoAFD());
                    }
                }
                estado = item.GetEstadoLlegada();
                if (!estadosFinales.Contains(estado.GetNombreEstadoAFD()))
                {
                    if (estado.GetTipo() == EstadoAFD.Tipo.FINAL)
                    {
                        estadosFinales.Add(estado.GetNombreEstadoAFD());
                    }
                }
            }
            string impresion = "";
            // Mueve mueveActual = mueveSinVacio.First();
            string evaluar = expresionEv.GetTokens().Last().GetValorToken();//como es una cadena solo tiene uno

            List <Mueve> listaTemp = new List <Mueve>();

            if (evaluar.Length == 0 && estadosFinales.Contains(0))
            {
                valido = true;
            }
            for (int i = 0; i < evaluar.Length; i++)//evaluando letra por letra
            {
                listaTemp.Clear();
                char letra = evaluar[i];
                valido = false; //reiniciando variable

                foreach (var mov in mueveSinVacio)
                {
                    if (mov.GetEstadoInicial().GetNombreEstadoAFD() == estadoActual)
                    {
                        listaTemp.Add(mov);
                    }
                }
                //obtenemos solo los mueves que tienen de estado inicial al estado actual
                List <Mueve> listOrdernada = listaTemp.OrderByDescending(o => o.GetSimbolo().Length).ToList();
                Console.WriteLine("LISTA ORDENADA");
                foreach (var item in listOrdernada)
                {
                    Console.WriteLine("estadoInicial " + item.GetInicialString() + "simbolo: " + item.GetSimbolo() + " final: " + item.GetLlegadaString());
                }
                //los mueves se orden de mayor a menor, segun la longitud de su transicion
                for (int j = 0; j < listOrdernada.Count; j++)
                {
                    Mueve  mueve             = listOrdernada.ElementAt(j);
                    string simboloTransicion = mueve.GetSimbolo();
                    //bool esConjunto = true;

                    if (simboloTransicion.Length > 1) //cadenas mayores a uno
                    {
                        int longitud = simboloTransicion.Length + i;
                        if (longitud <= evaluar.Length)
                        {
                            longitud -= i;
                            string subCadena = evaluar.Substring(i, longitud);
                            Console.WriteLine("subcadena " + subCadena + " simbolo " + simboloTransicion);
                            if (subCadena.Equals(mueve.GetSimbolo()))
                            {
                                estadoActual = mueve.GetEstadoLlegada().GetNombreEstadoAFD();
                                i           += subCadena.Length - 1;
                                valido       = true;
                                break;
                            }
                            if (simboloTransicion.Equals("[:todo:]") && !subCadena.Equals("\\n"))
                            {
                                estadoActual = mueve.GetEstadoLlegada().GetNombreEstadoAFD();
                                i           += subCadena.Length - 1;
                                valido       = true;
                                break;
                            }
                        }
                    }
                    if (listaConjuntos.ContainsKey(simboloTransicion)) //comparando si es un conjunto
                    {
                        Conjunto conjunto = listaConjuntos[simboloTransicion];
                        if (conjunto.GetElementos().Contains(letra.ToString()))//iguala con algun elemento de un conjunto
                        {
                            estadoActual = mueve.GetEstadoLlegada().GetNombreEstadoAFD();
                            valido       = true;
                            break;
                        }
                    }
                    else if (simboloTransicion == letra.ToString())
                    {
                        estadoActual = mueve.GetEstadoLlegada().GetNombreEstadoAFD();
                        valido       = true;
                        break;
                    }
                    else if (simboloTransicion.Equals("[:todo:]"))
                    {
                        estadoActual = mueve.GetEstadoLlegada().GetNombreEstadoAFD();
                        valido       = true;
                        break;
                    }
                    // Console.WriteLine("valida: " + valido);
                }
                Console.WriteLine("valida: " + valido);
                //si sale del segundo for sin encontrar una coincidencia es que no se puede, y la cadena no es valida
                if (valido == false)
                {
                    break; //No vale la pena seguir evaluando la expresion entonces para
                }
            }
            //Al salir la variable estadoActual debe ser un estado final para que la expresion sea valida
            if (valido == false)
            {
                impresion += expresionEv.GetNombre() + ": \"" + evaluar + "\" NO ES VALIDA, para la expresion regular evaluada\n";
            }
            else
            {
                if (estadosFinales.Contains(estadoActual))
                {
                    impresion += expresionEv.GetNombre() + ": \"" + evaluar + "\" ES VALIDA, para la expresion regular evaluada\n";
                }
                else
                {
                    impresion += expresionEv.GetNombre() + ": \"" + evaluar + "\" NO ES VALIDA, para la expresion regular evaluada\n";
                }
            }
            return(impresion);
        }