public void Emparejar(string t)
 {
     Console.WriteLine("ENTRO A Emaprejamiento");
     if (tar.variable == t)
     {
         textBox2.AppendText("<Linea: " + tar.numeroLinea + " Variable: \"" + tar.variable + "\" TOKEN: \"" + tar.valor + "\">\n");
         textBox2.AppendText("Se empareja: " + tar.valor + "\n");
         tar = AnalisisLexico(ref posicion, ref errDeCaracter);
         tea.Add(tar);
     }
     else
     {
         textBox2.AppendText("Error Sintactico de emparejamiento, EXPECTED: " + t + "\n");
     }
 }
        public TokensEnArchivo AnalisisLexico(ref int pos, ref string errDeCaracter)
        {
            int estadoActual = 0;
            int valor;

            bool isExpected = false;

            string          tok  = "";
            string          tipo = "";
            TokensEnArchivo tokADevolver;
            List <string>   expectedChars = new List <string>();

            while (lineas[pos].caracter == " " || lineas[pos].caracter == "\n" || lineas[pos].caracter == "\t")
            {
                pos++;
            }

            for (; pos < lineas.Count; pos++)
            {
                isExpected = false;
                foreach (Finales f in finales)
                {
                    if (estadoActual == f.estado)
                    {
                        tok = tok.Trim(new Char[] { ' ', '\n', '\t' });
                        foreach (string reserv in reservadas)
                        {
                            if (tok == reserv)
                            {
                                Console.WriteLine("ENTRO A RESERV" + " Variable: " + tok + " TOKEN: " + tok);
                                tokADevolver = new TokensEnArchivo(lineas[pos].numeroLinea, reserv, tok);
                                return(tokADevolver);
                            }
                        }
                        tokADevolver = new TokensEnArchivo(lineas[pos].numeroLinea, f.token, tok);
                        return(tokADevolver);
                    }
                }
                expectedChars = expectedChar(estadoActual);

                foreach (string s in expectedChars)
                {
                    if (lineas[pos].isNumber)
                    {
                        tipo = "NUMERO";
                    }
                    else if (lineas[pos].isLetter)
                    {
                        tipo = "ALFABETO";
                    }
                    else
                    {
                        tipo = lineas[pos].caracter;
                    }
                    if (tipo == s)
                    {
                        valor        = getPosAlfa(tipo);
                        estadoActual = cm.Matriz[estadoActual, valor];
                        tok         += lineas[pos].caracter;
                        isExpected   = true;
                        break;
                    }
                }
                if (!isExpected)
                {
                    tipo = "otro";
                    Console.WriteLine("ES OTRO");
                    valor = getPosAlfa(tipo);
                    if (cm.Matriz[estadoActual, valor] == -1)
                    {
                        errDeCaracter = "TOKEN INESPERADO: " + lineas[pos].caracter + ". TOKEN ESPERADO: ";
                        tok           = "ERROR400";
                        foreach (string s in expectedChars)
                        {
                            errDeCaracter += s + " || ";
                        }
                        textBox2.AppendText("\n");
                        lineas.Clear();
                        expectedChars.Clear();
                        tea.Clear();
                        tokADevolver = new TokensEnArchivo(1, tok, tok);
                        return(tokADevolver);
                    }
                    estadoActual = cm.Matriz[estadoActual, valor];
                    pos--;
                }
            }
            tokADevolver = new TokensEnArchivo(lineas[pos - 1].numeroLinea, "EOF", "EOF");
            return(tokADevolver);
        }
        /*
         * metodo que se acciona cuando se presiona el boton de checar cadena
         * basicamente obtiene el texto en la caja 2 y lo trata con
         * el automata para determinar si la cadena es correcta
         */
        private void button1_Click(object sender, EventArgs e)
        {
            int  contadorLineas = textBox1.Lines.Count();
            bool isNumber;
            bool isLetter;
            int  k = 0;

            posicion      = 0;
            errDeCaracter = "";
            List <string> expectedChars = new List <string>();


            for (int i = 0; i < contadorLineas; i++)
            {
                for (int j = 0; j < textBox1.Lines[i].Length; j++)
                {
                    string caracter = textBox1.Lines[i][j].ToString();
                    if (String.IsNullOrEmpty(caracter))
                    {
                        continue;
                    }
                    if (caracter == "\n")
                    {
                        caracter = " ";
                    }
                    if (caracter == "\t")
                    {
                        caracter = " ";
                    }
                    isNumber = checkIfNumero(caracter);
                    isLetter = checkIfLetter(caracter);
                    Lineas l = new Lineas(i + 1, caracter, isNumber, isLetter);
                    lineas.Add(l);
                }
                k = i + 1;
            }

            foreach (Caracteres c in caracteres)
            {
                if (lineas[lineas.Count - 1].caracter != c.valor && c.valor != "NUMERO" && c.valor != "ALFABETO" && c.valor != " ")
                {
                    Lineas final = new Lineas(k, c.valor, false, false);
                    // Console.WriteLine("VALOR FINAL: " + c.valor);
                    lineas.Add(final);
                    break;
                }
            }


            // Empieza análisis sintáctico
            tar = AnalisisLexico(ref posicion, ref errDeCaracter);
            tea.Add(tar);
            E();
            if (tar.variable != "EOF")
            {
                textBox2.AppendText("Error, se esperaba, fin de archivo(EOF)" + "\n");
            }

            /*  while (posicion < lineas.Count)
             * {
             *
             *    tar = AnalisisLexico(ref posicion, ref errDeCaracter);
             *    if(tar.valor == "ERROR400")
             *    {
             *        textBox2.AppendText(errDeCaracter);
             *        break;
             *    }
             *    else if (tar.valor == "EOF")
             *    {
             *        break;
             *    }
             *    E();
             *    tea.Add(tar);
             *   // Console.WriteLine("Linea: " + tar.numeroLinea + " Variable: " + tar.variable + " TOKEN: " + tar.valor);
             * }
             */
            /*
             *          foreach (TokensEnArchivo t in tea)
             *          {
             *             textBox2.AppendText("<Linea: " + t.numeroLinea + " Variable: \"" + t.variable + "\" TOKEN: \"" + t.valor + "\">\n");
             *          }
             */
            textBox2.AppendText("--------------------------------------------------------------" + "\n");
            tea.Clear();
            lineas.Clear();
            expectedChars.Clear();
            tar = null;
        }