public void generarTabla(List <NodoExpresion> listaNodos, List <int> numeros, List <Object> simbolos, String nombre, NodoExpresion final, ListaCircularGaleria lg, Galeria nuevoGaleria)
        {
            listaNodo     = listaNodos;
            name          = nombre;
            listaSimbolos = simbolos;
            ultimo        = final;
            List <int> estadosCerradura = new List <int>();

            for (int i = 0; i < numeros.Count; i++)
            {
                NodoExpresion paraCerradura = buscarNodo(numeros.ElementAt(i));
                if (paraCerradura != null)
                {
                    cerradura(paraCerradura, estadosCerradura);
                }
            }
            mostrarCerradura(estadosCerradura);
            Estado nuevoEstado = new Estado();

            nuevoEstado.EstadoInicial = j;
            j++;
            nuevoEstado.Numeros = numeros;
            bool has = estadosCerradura.Any(x => x == ultimo.Id);

            if (has == true)
            {
                nuevoEstado.Aceptacion = true;
            }
            transiciones.Add(nuevoEstado);
            List <Transicion> trancisionesEstado = new List <Transicion>();

            for (int i = 0; i < listaSimbolos.Count; i++)
            {
                List <int> estadosMueve = new List <int>();
                for (int l = 0; l < estadosCerradura.Count; l++)
                {
                    NodoExpresion paraMove = buscarNodo(estadosCerradura.ElementAt(l));
                    if (paraMove != null)
                    {
                        move(paraMove, listaSimbolos.ElementAt(i), estadosMueve);
                    }
                }
                if (estadosMueve.Count > 0)
                {
                    bool sn = existeCerradura(estadosMueve);
                    if (sn)
                    {
                        int        id = devolverId(estadosMueve);
                        Transicion nuevaTransicion = new Transicion();
                        nuevaTransicion.Estado  = id;
                        nuevaTransicion.Simbolo = listaSimbolos.ElementAt(i).ToString();
                        trancisionesEstado.Add(nuevaTransicion);
                    }
                    else
                    {
                        Estado apuntar = new Estado();
                        apuntar.EstadoInicial = j;
                        j++;
                        apuntar.Numeros = estadosMueve;
                        transiciones.Add(apuntar);

                        Transicion nuevaTransicion = new Transicion();
                        nuevaTransicion.Estado  = apuntar.EstadoInicial;
                        nuevaTransicion.Simbolo = listaSimbolos.ElementAt(i).ToString();
                        trancisionesEstado.Add(nuevaTransicion);
                        siguientes(estadosMueve, apuntar);
                    }
                }
            }
            nuevoEstado.Transiciones = trancisionesEstado;
            nuevoGaleria.Estados     = transiciones;
            lg.insertar(nuevoGaleria);
        }
Exemplo n.º 2
0
        public void analizadorLexico(String codigo, ListaCircularGaleria lg)
        {
            int    estado  = 0;
            int    columna = 0;
            int    fila    = 1;
            string lexema  = "";
            Char   c;

            codigo = codigo + " ";
            for (int i = 0; i < codigo.Length; i++)
            {
                c = codigo[i];
                columna++;
                switch (estado)
                {
                case 0:
                    if (Char.IsLetter(c))
                    {
                        lexema += c;
                        estado  = 1;
                    }
                    else if (c == '-')
                    {
                        lexema += c;
                        Token(lexema, "Guion", fila, columna, i - lexema.Length);
                        lexema = "";
                        estado = 2;
                    }
                    else if (c == ';')
                    {
                        lexema += c;
                        Token(lexema, "Punto y Coma", fila, columna, i - lexema.Length);
                        lexema    = "";
                        estado    = 0;
                        conjunto  = false;
                        expresion = false;
                        idconj    = "";
                        idexp     = "";
                        idlexema  = "";
                        exp       = "";
                        conj      = "";
                        lex       = "";
                    }
                    else if (c == ' ')
                    {
                        columna++;
                        estado = 0;
                    }
                    else if (c == '\n')
                    {
                        fila++;
                        estado  = 0;
                        columna = 0;
                    }
                    else if (c == ':')
                    {
                        lexema += c;
                        Token(lexema, "Dos Puntos", fila, columna, i - lexema.Length);
                        lexema = "";
                        estado = 0;
                    }
                    else if (c == '{')
                    {
                        lexema += c;
                        Token(lexema, "Llave Izquierda", fila, columna, i - lexema.Length);
                        lexema = "";
                        estado = 0;
                    }
                    else if (c == '}')
                    {
                        lexema += c;
                        Token(lexema, "Llave Derecha", fila, columna, i - lexema.Length);
                        lexema = "";
                        estado = 0;
                    }
                    else if (c == '\u0022')
                    {
                        lexema += c;
                        Token(lexema, "Comillas", fila, columna, i - lexema.Length);
                        lexema = "";
                        estado = 4;
                    }
                    else if (c == '/')
                    {
                        lexema += c;
                        estado  = 5;
                    }
                    else if (c == '<')
                    {
                        lexema += c;
                        estado  = 7;
                    }
                    else
                    {
                        lexema += c;
                        Error("Caracter Desconocido", lexema, fila, columna);
                        lexema = "";
                        estado = 0;
                    }
                    break;

                case 1:
                    if (Char.IsLetterOrDigit(c))
                    {
                        lexema += c;
                        estado  = 1;
                    }
                    else
                    {
                        Boolean reser = false;
                        reser = palabraReservada(lexema);
                        if (reser)
                        {
                            Token(lexema, "Palabra Reservada", fila, columna, i - lexema.Length);
                        }
                        else
                        {
                            Token(lexema, "Identificador", fila, columna, i - lexema.Length);
                        }
                        estado = 0;
                        i--;
                        columna--;
                        lexema = "";
                    }
                    break;

                case 2:
                    if (c == '>')
                    {
                        lexema += c;
                        Token(lexema, "Mayor que", fila, columna, i - lexema.Length);
                        lexema = "";
                        estado = 3;
                    }
                    else
                    {
                        estado = 0;
                    }
                    break;

                case 3:
                    if (c == ';')
                    {
                        if (conjunto == true)
                        {
                            conj = lexema;
                            Conjunto nuevoConjunto = new Conjunto(idconj, conj);
                            listaConjuntos.Add(nuevoConjunto);
                            Token(lexema, "Conjunto " + idconj, fila, columna, i - lexema.Length);
                        }
                        else if (conjunto == false)
                        {
                            exp = lexema;
                            Expresion nuevaExpresion = new Expresion(idexp, exp);
                            listaExpresiones.Add(nuevaExpresion);
                            Token(lexema, "Expresion Regular " + idexp, fila, columna, i - lexema.Length);
                        }

                        lexema = "";
                        estado = 0;
                        columna--;
                        i--;
                    }
                    else
                    {
                        lexema += c;
                    }
                    break;

                case 4:
                    if (c == '\u0022')
                    {
                        if (conjunto == false)
                        {
                            lex = lexema;
                            Lexema nuevoLexema = new Lexema(idlexema, lex);
                            listaLexemas.Add(nuevoLexema);
                            Token(lexema, "Lexema - " + idlexema, fila, columna, i - lexema.Length);
                            lexema = "";
                        }
                        lexema += c;
                        Token(lexema, "Comillas", fila, columna, i - lexema.Length);
                        lexema = "";
                        estado = 0;
                    }
                    else
                    {
                        lexema += c;
                    }
                    break;

                case 5:
                    if (c == '/')
                    {
                        lexema += c;
                        estado  = 6;
                    }
                    else
                    {
                        lexema += c;
                        Error("Caracter Desconocido", lexema, fila, columna);
                        lexema = "";
                        estado = 0;
                    }
                    break;

                case 6:
                    if (c == '\n')
                    {
                        Token(lexema, "Comentario Simple", fila, columna, i - lexema.Length);
                        lexema = "";
                        estado = 0;
                    }
                    else
                    {
                        lexema += c;
                    }
                    break;

                case 7:
                    if (c == '!')
                    {
                        lexema += c;
                        Token(lexema, "Abrir Comentario Multilinea", fila, columna, i - lexema.Length);
                        lexema = "";
                        estado = 8;
                    }
                    else
                    {
                        lexema += c;
                        Error("Caracter Desconocido", lexema, fila, columna);
                        lexema = "";
                        estado = 0;
                    }
                    break;

                case 8:
                    if (c == '!')
                    {
                        Token(lexema, "Comentario Multilinea", fila, columna, i - lexema.Length);
                        lexema  = "";
                        lexema += c;
                        estado  = 9;
                    }
                    else
                    {
                        lexema += c;
                    }
                    break;

                case 9:
                    if (c == '>')
                    {
                        lexema += c;
                        Token(lexema, "Cerrar Comentario Multilinea", fila, columna, i - lexema.Length);
                        lexema = "";
                        estado = 0;
                    }
                    else
                    {
                        lexema += c;
                        Error("Caracter Desconocido", lexema, fila, columna);
                        lexema = "";
                        estado = 0;
                    }
                    break;
                }
            }
            if (listaErrores.Count == 0)
            {
                Generar_Thompson gt = new Generar_Thompson();
                gt.separarNodos(listaExpresiones, lg);
            }
            else
            {
                MessageBox.Show("Existen Errores Lexicos");
            }
        }
        public void separarNodos(List <Expresion> listaExpresiones, ListaCircularGaleria lg)
        {
            for (int h = 0; h < listaExpresiones.Count; h++)
            {
                String expresion     = listaExpresiones.ElementAt(h).ExpresionRegular;
                String nombreGrafica = listaExpresiones.ElementAt(h).Identificador;
                int    estado        = 0;
                string lexema        = "";
                Char   c;
                grafica  += "digraph " + nombreGrafica + " { \n";
                grafica  += "rankdir = \u0022LR\u0022; \n";
                grafica  += "node [shape = circle, height=.1]; \n";
                expresion = expresion + " ";
                for (int i = 0; i < expresion.Length; i++)
                {
                    c = expresion[i];
                    switch (estado)
                    {
                    case 0:
                        if (c == '|')
                        {
                            nodos.Add(c);
                        }
                        else if (c == '.')
                        {
                            nodos.Add(c);
                        }
                        else if (c == '+')
                        {
                            nodos.Add(c);
                        }
                        else if (c == '*')
                        {
                            nodos.Add(c);
                        }
                        else if (c == '?')
                        {
                            nodos.Add(c);
                        }
                        else if (c == '{')
                        {
                            estado = 1;
                        }
                        else if (c == '\u0022')
                        {
                            lexema += c;
                            estado  = 2;
                        }
                        break;

                    case 1:
                        if (c == '}')
                        {
                            nodos.Add(lexema);
                            lexema = "";
                            estado = 0;
                        }
                        else
                        {
                            lexema += c;
                        }
                        break;

                    case 2:
                        if (c == '\u0022')
                        {
                            lexema += c;
                            nodos.Add(lexema);
                            lexema = "";
                            estado = 0;
                        }
                        else
                        {
                            lexema += c;
                        }
                        break;
                    }
                }
                j = 0;
                Object        nodo  = nodos.ElementAt(j);
                NodoExpresion nuevo = new NodoExpresion();
                nuevo.Id = j;
                listaNodos.Add(nuevo);
                generarAFN(nodo, 0, nuevo);
                raiz     = nuevo;
                grafica += "}";
                Graficador gr = new Graficador();
                gr.graficar(grafica, nombreGrafica);
                MetodoSubconjuntos ms      = new MetodoSubconjuntos();
                List <int>         numeros = new List <int>();
                numeros.Add(0);
                Galeria nuevoGaleria = new Galeria();
                nuevoGaleria.Nombre   = nombreGrafica;
                nuevoGaleria.Simbolos = simbolos;
                ms.generarTabla(listaNodos, numeros, simbolos, nombreGrafica, ultimo, lg, nuevoGaleria);
                ms.GraficarAFD();
                nodos      = new List <object>();
                listaNodos = new List <NodoExpresion>();
                simbolos   = new List <object>();
                j          = 0;
                k          = 0;
                grafica    = "";
            }
        }