public void upDateLexema(ArrayList listaToken, RichTextBox consola)
        {
            int estado = 0;

            consola.Text += "-------------------------------------------------------------------------------\n";
            consola.Text += "                               [Validando Lexemas]                        \n";
            consola.Text += "-------------------------------------------------------------------------------\n";

            for (int i = 0; i < listaToken.Count; i++)
            {
                token item = (token)listaToken[i];
                switch (estado)
                {
                //Debemos encontrar un identificador para continuar con el analisis
                case 0:
                    switch (item.getTipo())
                    {
                    case token.tipo.CONJ:
                        estado = 1;
                        break;

                    case token.tipo.IDENTIFICADOR:
                        token auxEval = (token)listaToken[i + 1];
                        if (auxEval.getTipo() == token.tipo.DOS_PUNTOS)
                        {
                            //Ir a estado para controlar ingreso de expresionRegular
                            estado   = 2;
                            idActual = item.getValor();
                            //Si no existe la expresion insertarla
                            if (!existeER(idActual))
                            {
                                //Notificar que no existe esa expresion regular
                                consola.Text += "(ID No Existe) *No se encontro una expresion regular con ese identificador -" + idActual + "-* \n";
                                estado        = 1;
                            }
                        }
                        break;
                    }
                    break;

                case 1:
                    if (item.getTipo() == token.tipo.PUNTO_COMA)
                    {
                        //Hasta encontrar un punto y coma omitir lo que viene
                        estado = 0;
                    }
                    break;

                case 2:
                    //Si encontramos una cadena
                    if (item.getTipo() == token.tipo.CADENA)
                    {
                        string lexemaStr = item.getValor().TrimStart('"');
                        lexemaStr = lexemaStr.Remove(lexemaStr.Length - 1, 1);
                        posEr(idActual).addLexema(lexemaStr);
                        consola.Text += "Cadena: " + item.getValor() + " insertada en la expresion: " + idActual + "\n";
                    }
                    //Si encontramos un punto y coma
                    else if (item.getTipo() == token.tipo.PUNTO_COMA)
                    {
                        estado = 0;
                    }
                    //Ignorar los dos puntos
                    else if (item.getTipo() == token.tipo.DOS_PUNTOS)
                    {
                        //No hacer nada
                    }
                    //Cualquier otro tipo de token
                    else
                    {
                        printError(consola, item.getValor(), "cadena");
                    }
                    break;
                }
            }
        }
        public void upDateEr(ArrayList listaToken, RichTextBox consola)
        {
            int estado     = 0;
            int conjEstado = 0;
            int erEstado   = 0;

            consola.Text += "-------------------------------------------------------------------------------\n";
            consola.Text += "                       [Insertando expresiones regulares]                        \n";
            consola.Text += "-------------------------------------------------------------------------------\n";


            for (int i = 0; i < listaToken.Count; i++)
            {
                token item = (token)listaToken[i];
                switch (estado)
                {
                //Estado inicial para evaluar los tokens
                case 0:
                    switch (item.getTipo())
                    {
                    //Si es un conjunto evaluar tokens siguientes
                    case token.tipo.CONJ:
                        //Ir a estado para controlar ingreso de conjunto
                        estado = 1;
                        break;

                    //Si es un identificador inicial evaluar tokens siguientes
                    case token.tipo.IDENTIFICADOR:
                        token auxEval = (token)listaToken[i + 1];
                        //Evaluar si es asignacion de expresion regular
                        if (auxEval.getTipo() == token.tipo.ASIGNACION)
                        {
                            //Ir a estado para controlar ingreso de expresionRegular
                            estado   = 2;
                            idActual = item.getValor();
                            //Si no existe la expresion insertarla
                            if (!existeER(idActual))
                            {
                                Program.listER.Add(new er(idActual, Program.listER.Count + 1, Program.conteoAnalisis));
                            }
                            else
                            {
                                consola.Text += "(ID Duplicado) *No puede tener identificadores duplicados -" + idActual + "-* \n";
                                //Ir al estado para controlar expresion repetida
                                estado = 3;
                            }
                        }
                        break;
                    }
                    break;

                case 1:
                    switch (conjEstado)
                    {
                    //Debemos encontrar un identificador para pasar al siguiente estado
                    case 0:
                        //Si encontramos un identificador podemos seguir
                        if (item.getTipo() == token.tipo.IDENTIFICADOR)
                        {
                            conjEstado = 1;
                            Program.listConj.Add(new nodoConj(item.getValor()));
                            idActual = item.getValor();
                        }
                        //Ignorar caracter :
                        else if (item.getTipo() == token.tipo.DOS_PUNTOS)
                        {
                            //No hacer nada
                        }
                        else
                        {
                            printError(consola, item.getValor(), "identificador");
                        }
                        break;

                    case 1:
                        //Debemos encontrar un simbolo de asignacion
                        if (item.getTipo() == token.tipo.ASIGNACION)
                        {
                            conjEstado = 2;
                        }
                        //Sino mostrar error sintactico
                        else
                        {
                            printError(consola, item.getValor(), "asignacion");
                        }
                        break;

                    case 2:

                        //Debemos insertar el conjunto
                        if (item.getTipo() == token.tipo.CARACTER || item.getTipo() == token.tipo.NUMERO || item.getTipo() == token.tipo.SIMBOLO || item.getTipo() == token.tipo.SALTO_LINEA || item.getTipo() == token.tipo.COMILLA_SIMPLE || item.getTipo() == token.tipo.COMILLA_DOBLE || item.getTipo() == token.tipo.TABULACION || item.getTipo() == token.tipo.CUALQUIER_CARACTER)
                        {
                            //Si encontramos un token valido de un conjunto insertar
                            posConj(idActual).addItem(item.getValor());
                        }
                        else if (item.getTipo() == token.tipo.COMA)
                        {
                            //Si encontramos una coma seguir en este case
                            //Ignorar la coma solo mantenerse en el estado 2
                        }
                        else if (item.getTipo() == token.tipo.MACRO)
                        {
                            //Si encontramos un macro ir al case para tratar macros
                            conjEstado = 3;
                        }
                        else if (item.getTipo() == token.tipo.PUNTO_COMA)
                        {
                            //Si encontramos un punto y coma regresar al estado 0
                            conjEstado = 0;
                            estado     = 0;
                        }
                        else
                        {
                            //Notificar un error sintactico
                            printError(consola, item.getValor(), "conjunto");
                        }

                        break;

                    case 3:

                        if (item.getTipo() == token.tipo.CARACTER)
                        {
                            //Insertar los caracteres
                            string itemInicio      = (string)posConj(idActual).getConjunto()[0];
                            char   caracterInicial = itemInicio[0];

                            for (int j = caracterInicial + 1; j <= (char)item.getValor()[0]; j++)
                            {
                                char charInsert = (char)j;
                                if (char.IsLetter(charInsert))
                                {
                                    posConj(idActual).getConjunto().Add(charInsert.ToString());
                                }
                            }
                        }
                        else if (item.getTipo() == token.tipo.NUMERO)
                        {
                            //Insertar el conjunto de numeros

                            int itemInicio = Int32.Parse(posConj(idActual).getConjunto()[0].ToString());

                            for (int j = itemInicio + 1; j <= int.Parse(item.getValor()); j++)
                            {
                                posConj(idActual).getConjunto().Add(j.ToString());
                            }
                        }
                        else if (item.getTipo() == token.tipo.SIMBOLO)
                        {
                            //Insertar los caracteres
                            string itemInicio      = (string)posConj(idActual).getConjunto()[0];
                            char   caracterInicial = itemInicio[0];

                            for (int j = caracterInicial + 1; j <= (char)item.getValor()[0]; j++)
                            {
                                char charInsert = (char)j;
                                if (!char.IsLetterOrDigit(charInsert))
                                {
                                    posConj(idActual).getConjunto().Add(charInsert.ToString());
                                }
                            }
                        }
                        else if (item.getTipo() == token.tipo.PUNTO_COMA)
                        {
                            //Regresar todo al inicio
                            conjEstado = 0;
                            estado     = 0;
                        }
                        else
                        {
                            //Notificar un error sintactico
                            printError(consola, item.getValor(), "caracter|numero|simbolo");
                        }
                        break;
                    }
                    break;

                case 2:
                    switch (erEstado)
                    {
                    case 0:
                        //Debemos encontrar un token asignacion
                        if (item.getTipo() == token.tipo.ASIGNACION)
                        {
                            erEstado = 1;
                        }
                        else if (item.getTipo() == token.tipo.DOS_PUNTOS)
                        {
                            estado = 3;
                        }
                        else
                        {
                            //Notificar un error sintactico
                            printError(consola, item.getValor(), "asignacion");
                        }
                        break;

                    case 1:
                        if (item.getTipo() == token.tipo.CADENA || item.getTipo() == token.tipo.IDENTIFICADOR || item.getTipo() == token.tipo.TABULACION || item.getTipo() == token.tipo.SALTO_LINEA || item.getTipo() == token.tipo.COMILLA_DOBLE || item.getTipo() == token.tipo.COMILLA_SIMPLE || item.getTipo() == token.tipo.CUALQUIER_CARACTER)
                        {
                            //Si encontramos una cadena insertar un nodo hoja
                            if (item.getTipo() == token.tipo.CADENA)
                            {
                                string lexemaStr = item.getValor().TrimStart('"');
                                lexemaStr = lexemaStr.Remove(lexemaStr.Length - 1, 1);

                                posEr(idActual).addNodoArbol(lexemaStr, 0, 0);
                            }
                            else if (item.getTipo() == token.tipo.IDENTIFICADOR)
                            {
                                posEr(idActual).addNodoArbol(item.getValor(), 0, 1);
                            }
                            else
                            {
                                posEr(idActual).addNodoArbol(item.getValor(), 0, 0);
                            }
                        }
                        else if (item.getTipo() == token.tipo.CERRADURA_DUDA || item.getTipo() == token.tipo.CERRADURA_KLEENE || item.getTipo() == token.tipo.CERRADURA_POSITIVA)
                        {
                            //Si insertamos una cerradura, ingresar un nodo cerradura
                            posEr(idActual).addNodoArbol(item.getValor(), 2, 0);
                        }
                        else if (item.getTipo() == token.tipo.CONCATENACION || item.getTipo() == token.tipo.DISYUNCION)
                        {
                            //Si encontramos una operacion insertar el nodo
                            posEr(idActual).addNodoArbol(item.getValor(), 1, 0);
                        }
                        else if (item.getTipo() == token.tipo.LLAVE_DER || item.getTipo() == token.tipo.LLAVE_IZQ)
                        {
                            //Ignorar llaves
                        }
                        else if (item.getTipo() == token.tipo.PUNTO_COMA)
                        {
                            try
                            {
                                //Generar AFND
                                posEr(idActual).funcionAFND();
                                posEr(idActual).funcionAFD();
                                consola.Text += "-------------------------------------------------------------------------------\n";
                                consola.Text += "                   [Expresion " + idActual + " insertada con exito]                       \n";
                                consola.Text += "-------------------------------------------------------------------------------\n";
                            }
                            catch (Exception e)
                            {
                                consola.Text += "***Error al generar la expresion regular " + idActual + ", verifica que este escrita correctamente.*** \n";
                                consola.Text += e + "\n";
                            }
                            //Regresar al estado inicial
                            erEstado = 0;
                            estado   = 0;
                        }
                        else
                        {
                            //Notificar un error sintactico
                            printError(consola, item.getValor(), "Expresion Regular");
                        }

                        break;
                    }
                    break;

                case 3:
                    //Omitir todo el contenido hasta encontrar un punto y coma
                    if (item.getTipo() == token.tipo.PUNTO_COMA)
                    {
                        //Regresar todo al inicio
                        conjEstado = 0;
                        erEstado   = 0;
                        estado     = 0;
                    }
                    break;
                }
            }
        }