public List <String> Evaluar(String codigo)
        {
            var parser = new AnalizadorSintactico(codigo);
            var arbol  = parser.Analizar();

            TokenList = parser.TokenList;

            ListaExpresiones = new List <Token>();

            //for (int i = 0; i < TokenList.Count; i++)
            //{
            //    if (TokenList[i].Tipo == TipoSintaxis.IntegerKeyword ||
            //        TokenList[i].Tipo == TipoSintaxis.FloatKeyword ||
            //        TokenList[i].Tipo == TipoSintaxis.StringKeyword)
            //    {
            //        // Current int
            //        // i++ -> Current =
            //        // i++ -> Current Identifier/Number.
            //        // i++ -> Current ;
            //        var id = TokenList[i++];
            //        i++;// Equals token.
            //        var actual = TokenList[++i];
            //        while (actual.Tipo != TipoSintaxis.TokenPuntoyComa)
            //        {
            //            ListaExpresiones.Add(actual);
            //            actual = TokenList[++i];
            //        }
            //    }
            //}


            // Agregamos los errores sintacticos.
            Diagnostico.AddRange(arbol.Diagnostico);

            // Generate Symbols table
            var tablaSimbolosSintactica = TablaSintaxis = parser.TablaSimbolos;

            foreach (var registro in tablaSimbolosSintactica)
            {
                var token = (Token)registro.Value;
                if (token.Tipo == TipoSintaxis.TokenInteger ||
                    token.Tipo == TipoSintaxis.LongKeyword ||
                    token.Tipo == TipoSintaxis.TokenDecimal ||
                    token.Tipo == TipoSintaxis.DoubleKeyword)
                {
                    if (token.Value is ExpresionNumericaInvalida)
                    {
                        continue;
                    }

                    try
                    {
                        var result = EvaluarExpresionAritmetica((Expresion)token.Value, token.Tipo);
                        if ((result as Token).Tipo == TipoSintaxis.TokenInvalido)
                        {
                            continue;
                        }
                        // Si existe ya ese identificador, marcar error en cualquier caso invalido.
                        this.TablaSimbolos[registro.Key] = result;
                    }
                    catch (Exception ex)
                    {
                    }
                }
                else if (token.Tipo == TipoSintaxis.BoolKeyword)
                {
                    var result = EvaluarExpresionLogica((Expresion)token.Value);
                    this.TablaSimbolos[registro.Key] = result;
                }
                else if (token.Tipo == TipoSintaxis.StringKeyword)
                {
                    if (token.Value is ExpresionStringInvalida)
                    {
                        continue;
                    }
                    var result = EvaluarExpresionString(token.Value as Expresion);
                    this.TablaSimbolos[registro.Key] = result;
                }
            }

            return(Diagnostico);
        }
        public static ArbolSintactico Analizar(string texto)
        {
            var analizadorSintactico = new AnalizadorSintactico(texto);

            return(analizadorSintactico.Analizar());
        }