Complicadores

Iniciado por Choclito, 9 Noviembre 2010, 04:17 AM

0 Miembros y 1 Visitante están viendo este tema.

Choclito

HOla a todos hace poco hize un analizador Lexico y me dio curiosidad de compartirlo y si tienen alguna mejora mucho mejor podriamoz compartir.
y en el siguiente enlace hize unos videitos sobre los patrones de las variables y/o palabras reservadas: http://www.youtube.com/watch?v=X50-vn-5h0E
bueno si les agrada buen provecho

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace AnalizadorLexico
{
    public partial class Form1 : Form
    {
        int x;//Declaro una Variable Publica para Guardar las Posicones
        //Declaro 3 Arreglos Mas Para Guardar mis Simbolos
        bool Erro = false;
        public static int[] Codigo=new int[61];
        public static string[] Tokens = new string[61];
        public static string[] Simbolo = new string[61];
        public Form1()
        {
            InitializeComponent();
            for (int i = 0; i < Codigo.Length; i++) // Inicializamos los Codigos
                Codigo[i] = i + 1;
            Simbolo[0] = "Procedimiento"; Tokens[0] = "PALABRA RESERVADA - PR";
            Simbolo[1] = "Funcion"; Tokens[1] = "PALABRA RESERVADA - PR";
            Simbolo[2] = "Principal";Tokens[2] = "PALABRA RESERVADA - PR";
            Simbolo[3] = "Entero";Tokens[3] = "PALABRA RESERVADA - PR";
            Simbolo[4] = "Decimal";Tokens[4] = "PALABRA RESERVADA - PR";
            Simbolo[5] = "Doble";Tokens[5] = "PALABRA RESERVADA - PR";
            Simbolo[6] = "Caracter";Tokens[6] = "PALABRA RESERVADA - PR";
            Simbolo[7] = "Cadena";Tokens[7] = "PALABRA RESERVADA - PR";
            Simbolo[8] = "Booleano";Tokens[8] = "PALABRA RESERVADA - PR";
            Simbolo[9] = "Si";Tokens[9] = "PALABRA RESERVADA - PR";
            Simbolo[10] = "Entonces";Tokens[10] = "PALABRA RESERVADA - PR";
            Simbolo[11] = "Sino";Tokens[11] = "PALABRA RESERVADA - PR";
            Simbolo[12] = "Abrir";Tokens[12] = "PALABRA RESERVADA - PR";
            Simbolo[13] = "Caso";Tokens[13] = "PALABRA RESERVADA - PR";
            Simbolo[14] = "Quiebre";Tokens[14] = "PALABRA RESERVADA - PR";
            Simbolo[15] = "Defecto";Tokens[15] = "PALABRA RESERVADA - PR";
            Simbolo[16] = "Ira";Tokens[16] = "PALABRA RESERVADA - PR";
            Simbolo[17] = "Retornar";Tokens[17] = "PALABRA RESERVADA - PR";
            Simbolo[18] = "Para";Tokens[18] = "PALABRA RESERVADA - PR";
            Simbolo[19] = "Mientras";Tokens[19] = "PALABRA RESERVADA - PR";
            Simbolo[20] = "Hacer";Tokens[20] = "PALABRA RESERVADA - PR";
            Simbolo[21] = "Mostrar";Tokens[21] = "PALABRA RESERVADA - PR";
            Simbolo[22] = "Leer";Tokens[22] = "PALABRA RESERVADA - PR";
            Simbolo[23] = "Limpiar";Tokens[23] = "PALABRA RESERVADA - PR";
            Simbolo[24] = "Pausa";Tokens[24] = "PALABRA RESERVADA - PR";
            Simbolo[25] = "Abs";Tokens[25] = "PALABRA RESERVADA - PR";
            Simbolo[26] = "Mod";Tokens[26] = "PALABRA RESERVADA - PR";
            Simbolo[27] = "Exp";Tokens[27] = "PALABRA RESERVADA - PR";
            Simbolo[28] = "Sqrt";Tokens[28] = "PALABRA RESERVADA - PR";
            Simbolo[29] = "(";Tokens[29] = "SIGNO SEPARADOR";
            Simbolo[30] = ")";Tokens[30] = "SIGNO SEPARADOR";
            Simbolo[31] = "{";Tokens[31] = "SIGNO SEPARADOR";
            Simbolo[32] = "}";Tokens[32] = "SIGNO SEPARADOR";
            Simbolo[33] = "[";Tokens[33] = "SIGNO SEPARADOR";
            Simbolo[34] = "]";Tokens[34] = "SIGNO SEPARADOR";
            Simbolo[35] = "+";Tokens[35] = "OPERADOR - OP";
            Simbolo[36] = "-"; Tokens[36] = "OPERADOR - OP";
            Simbolo[37] = "*"; Tokens[37] = "OPERADOR - OP";
            Simbolo[38] = "/"; Tokens[38] = "OPERADOR - OP";
            Simbolo[39] = "&&"; Tokens[39] = "OPERADOR - OP";
            Simbolo[40] = "++"; Tokens[40] = "OPERADOR - OP";
            Simbolo[41] = "--"; Tokens[41] = "OPERADOR - OP";
            Simbolo[42] = "="; Tokens[42] = "SIGNO COMPARADOR - SC";
            Simbolo[43] = "=="; Tokens[43] = "SIGNO COMPARADOR - SC";
            Simbolo[44] = "<="; Tokens[44] = "SIGNO COMPARADOR - SC";
            Simbolo[45] = ">="; Tokens[45] = "SIGNO COMPARADOR - SC";
            Simbolo[46] = "<"; Tokens[46] = "SIGNO COMPARADOR - SC";
            Simbolo[47] = ">"; Tokens[47] = "SIGNO COMPARADOR - SC";
            Simbolo[48] = "!="; Tokens[48] = "SIGNO COMPARADOR - SC";
            Simbolo[49] = "!"; Tokens[49] = "SIGNO RELACIONADOR - SR";
            Simbolo[50] = "&"; Tokens[50] = "SIGNO RELACIONADOR - SR";
            Simbolo[51] = "|"; Tokens[51] = "SIGNO RELACIONADOR - SR";
            Simbolo[52] = ","; Tokens[52] = "SIGNO DE PUNTUACION - SP";
            Simbolo[53] = ";"; Tokens[53] = "SIGNO DE PUNTUACION - SP";
            Simbolo[54] = ":"; Tokens[54] = "SIGNO DE PUNTUACION - SP";
            Simbolo[55] = "\""; Tokens[55] = "SIGNO DE PUNTUACION - SP";
            Simbolo[56] = "'"; Tokens[56] = "SIGNO DE PUNTUACION - SP";
            Simbolo[57] = "."; Tokens[57] = "SIGNO DE PUNTUACION - SP";
            Simbolo[58] = "_"; Tokens[58] = "SIGNO SEPARADOR";
            Simbolo[59] = "FALSE"; Tokens[59] = "Booleano - BO";
            Simbolo[60] = "TRUE"; Tokens[60] = "Booleano - BO";
        }
        private void btnAnalizar_Click(object sender, EventArgs e)
        {
            if (dgvtokens.RowCount > 0) // Limpio Simpre y Cuando Hayga Datos en el DataGridWied
                dgvtokens.Rows.Clear();
            if (dgvErrores.RowCount > 0)
                dgvErrores.Rows.Clear();
            Erro = false;
            richTextBox2.Text = "";
            Analizar(); //LLamo ah mi Procedimiento Analizar
        }
        private void Analizar()
        {           
            char[] Cadena = richTextBox1.Text.ToCharArray();//Separo del Texto Fuente En Caracteres Separados y Almaceno en un Array de tipo Caracter
            string Texto = "";
            int i = 0; //Declaro mi Contador para Poder Recorrer toda la Cadena
            while (i < Cadena.Length)
            {
                if (i < Cadena.Length - 1)
                {
                    //Verificamos con que Letra Empiezza i
                    if (AnalizarLetra(Cadena[i]))
                    {
                        x = i;//Guardamos la Posicion Donde Empieza
                        while (AnalizarNumero(Cadena[i]) || AnalizarLetra(Cadena[i]) || Cadena[i] == '_')//Repetira Mientras Sea un Numero oh una Letra
                        {
                            Texto = Texto + Cadena[i].ToString();
                            i++;
                            if (i == Cadena.Length) break;//Si Llegamos ah la Ultina Posicion Salimos porque ya no hay nada por analizar
                        }
                        //Ver si es una Palabra Reservada oh es un Identificador
                        PR(Texto); //Llamamos ah un Procedimiento Palabra Reservada -PR para Confirmar si es una PR                   
                        Texto = "";
                    }
                    else if (AnalizarNumero(Cadena[i]) || (Cadena[i].ToString() == "-" && AnalizarNumero(Cadena[i + 1])))
                    {
                        x = i;//Guardamos la Posicion Donde Empieza     
                        string Ti = "E";
                        bool SolounPunto = true; //Inicializamos una Variable Aux que nos Va Indicar que la Concadenacion ya Tiene un Punto y no Puede Aceptar mas
                        if (Cadena[i].ToString() == "-") //si es que primero empieza con un -
                        {
                            Texto = Texto + Cadena[i].ToString();
                            i += 1;                           
                        }
                        while (AnalizarNumero(Cadena[i])) //Repetira mientras sea un Numero
                        {
                            Texto = Texto + Cadena[i].ToString();
                            i++;
                            if (i < Cadena.Length - 1) //entrara siempre y cuando no sea el ultimo Caracter del Texto fuente
                            {
                                if (Cadena[i] == '.' && AnalizarNumero(Cadena[i + 1]) && SolounPunto) // Si se Cumple las Reglas Seguimos Cancadenando
                                {
                                    Texto = Texto + Cadena[i].ToString();
                                    SolounPunto = false;
                                    Ti = "D";
                                    i++;
                                }
                            }
                            if (i == Cadena.Length) break;//Si Llegamos ah la Ultina Posicion Salimos porque ya no hay nada por analizar
                        }
                        //Mostrar el Numero 
                        if (Ti == "E") //Si es Entero
                        {
                            dgvtokens.RowCount = dgvtokens.RowCount + 1;
                            dgvtokens[0, dgvtokens.RowCount - 1].Value = "60";
                            dgvtokens[1, dgvtokens.RowCount - 1].Value = Texto.ToString();
                            dgvtokens[2, dgvtokens.RowCount - 1].Value = "NUMERO ENTERO - NE";
                            dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
                            Texto = "";
                        }
                        else //Si es Decimal
                        {
                            dgvtokens.RowCount = dgvtokens.RowCount + 1;
                            dgvtokens[0, dgvtokens.RowCount - 1].Value = "61";
                            dgvtokens[1, dgvtokens.RowCount - 1].Value = Texto.ToString();
                            dgvtokens[2, dgvtokens.RowCount - 1].Value = "NUMERO DECIMAL - ND";
                            dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
                            Texto = "";
                        }
                    }
                    else if (Cadena[i].ToString() == " " || Cadena[i].ToString() == "\n" || Cadena[i].ToString() == "\t")//si hay un espacio o un enter seguimos avanzando
                        i++;
                    else if (char.IsSymbol(Cadena[i]) || char.IsSeparator(Cadena[i]) || char.IsPunctuation(Cadena[i])) // ahora vemos si son simbolos
                    {
                        x = i;
                        if (i < Cadena.Length - 1)
                        {
                            if (Cadena[i].ToString() == "=" && Cadena[i + 1].ToString() == "=")
                            {
                                string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
                                AnalizarSimbolo(Union, x);
                                i = i + 2;
                            }
                            else if (Cadena[i].ToString() == "!" && Cadena[i + 1].ToString() == "=")
                            {
                                string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
                                AnalizarSimbolo(Union, x);
                                i = i + 2;
                            }
                            else if (Cadena[i].ToString() == ">" && Cadena[i + 1].ToString() == "=")
                            {
                                string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
                                AnalizarSimbolo(Union, x);
                                i = i + 2;
                            }
                            else if (Cadena[i].ToString() == "<" && Cadena[i + 1].ToString() == "=")
                            {
                                string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
                                AnalizarSimbolo(Union, x);
                                i = i + 2;
                            }
                            else if (Cadena[i].ToString() == "+" && Cadena[i + 1].ToString() == "+")
                            {
                                string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
                                AnalizarSimbolo(Union, x);
                                i = i + 2;
                            }
                            else if (Cadena[i].ToString() == "-" && Cadena[i + 1].ToString() == "-")
                            {
                                string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
                                AnalizarSimbolo(Union, x);
                                i = i + 2;
                            }
                            else if (Cadena[i].ToString() == "&" && Cadena[i + 1].ToString() == "&")
                            {
                                string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
                                AnalizarSimbolo(Union, x);
                                i = i + 2;
                            }
                            else if (Cadena[i].ToString() == "/" && Cadena[i + 1].ToString() == "/") // Para los Comentarios de Linea
                            {
                                string Union = "";
                                x = i;
                                for (int j = i; j < Cadena.Length; j++)
                                {
                                    if (Cadena[i].ToString() != "\n")
                                    {
                                        Union = Union + Cadena[j];
                                        i += 1;//Incremento mi Contador
                                    }
                                    else
                                    {
                                        i = j;//Intercambio la Posicion Donde Estuvo el Enter
                                        break;
                                    }
                                }
                                dgvtokens.RowCount = dgvtokens.RowCount + 1;
                                dgvtokens[0, dgvtokens.RowCount - 1].Value = "65";
                                dgvtokens[1, dgvtokens.RowCount - 1].Value = Union.ToString();
                                dgvtokens[2, dgvtokens.RowCount - 1].Value = "COMENTARIO DE LINEA - CL";
                                dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
                            }
                            else if (Cadena[i].ToString() == "/" && Cadena[i + 1].ToString() == "*") // Para los Comentarios de Parrafo
                            {
                                x = i;
                                int flag = -1;
                                //Recorro Toda mi Cadena para Ver si se Encuentra * y el /
                                for (int j = i + 2; j < Cadena.Length; j++)
                                {
                                    if (j + 1 != Cadena.Length)
                                    {
                                        if (Cadena[j].ToString() == "*" && Cadena[j + 1].ToString() == "/")
                                        {
                                            flag = j + 1;
                                            break;
                                        }
                                    }
                                }
                                if (flag > -1)
                                {
                                    i = flag + 1;
                                    dgvtokens.RowCount = dgvtokens.RowCount + 1;
                                    dgvtokens[0, dgvtokens.RowCount - 1].Value = "65";
                                    dgvtokens[1, dgvtokens.RowCount - 1].Value = "/* */";
                                    dgvtokens[2, dgvtokens.RowCount - 1].Value = "COMENTARIO DE PARRAFO - CP";
                                    dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
                                }
                                else
                                {
                                    AnalizarSimbolo(Cadena[i].ToString(), x);//Analizo el Simbolo Solo
                                    i = i + 1;
                                }
                            }
                            else if (Cadena[i].ToString() == "\"") //Cada Vez que encuentra una Comilla
                            {
                                int flag = -1;
                                string Union = "";
                                x = i;
                                //Recorrer Toda la Cadena Hasta Ubicar el ""
                                for (int j = i + 1; j < Cadena.Length; j++)
                                {
                                    if (Cadena[j].ToString() == "\"")
                                    {
                                        flag = j;
                                        break;
                                    }
                                    else if (Cadena[j].ToString() == "\n")//oh si llego ah fin de linea y no encontro nada
                                    {
                                        flag = -1;
                                        break;
                                    }
                                }
                                if (flag > -1)
                                {
                                    i = flag + 1;//Actualizamos la Nueva Posicion ah Buscar e Incrementado mas uno
                                    //Un Pequeño Recorrido para Concadenar
                                    for (int k = x; k < i; k++)
                                        Union = Union + Cadena[k];
                                    dgvtokens.RowCount = dgvtokens.RowCount + 1;
                                    dgvtokens[0, dgvtokens.RowCount - 1].Value = "62";
                                    dgvtokens[1, dgvtokens.RowCount - 1].Value = Union.ToString();
                                    dgvtokens[2, dgvtokens.RowCount - 1].Value = "CADENA - CA";
                                    dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
                                }
                                else
                                {
                                    AnalizarSimbolo(Cadena[i].ToString(), x);//Analizo el Simbolo Solo
                                    i = i + 1;
                                }
                            }
                            else if (Cadena[i].ToString() == "'") //Cada Vez que Encuentre una Comilla Simple
                            {
                                x = i;
                                string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
                                i = i + 2;
                                if (i <= Cadena.Length - 1)
                                {
                                    if (Cadena[i].ToString() == "'") //Si Cumple la Condicion
                                    {
                                        dgvtokens.RowCount = dgvtokens.RowCount + 1;
                                        dgvtokens[0, dgvtokens.RowCount - 1].Value = "63";
                                        dgvtokens[1, dgvtokens.RowCount - 1].Value = Union.ToString() + Cadena[i].ToString();
                                        dgvtokens[2, dgvtokens.RowCount - 1].Value = "CARACTER - CR";
                                        dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
                                        i++;
                                    }
                                    else
                                    {
                                        i = x;
                                        AnalizarSimbolo(Cadena[i].ToString(), x);
                                        i = i + 1;
                                    }
                                }
                                else //Regreso al Principio donde Almaceno mi Puntero
                                {
                                    i = x;
                                    AnalizarSimbolo(Cadena[i].ToString(), x);
                                    i = i + 1;
                                }
                            }
                            else //Si no se Cumple nada de las Condiciones Dada Analizo el Simbolo para Ver si es un Desconocido
                            {
                                AnalizarSimbolo(Cadena[i].ToString(), x);
                                i = i + 1;
                            }
                        }
                        else // Si Solo  Tengo un Simbolo
                        {
                            AnalizarSimbolo(Cadena[i].ToString(), x);
                            i = i + 1;
                        }
                    }
                }
                else //Si solo es una Cadena de Longitud 1
                {
                    x = i;
                    if (AnalizarNumero(Cadena[i]))
                    {
                        Texto = Cadena[i].ToString();
                        dgvtokens.RowCount = dgvtokens.RowCount + 1;
                        dgvtokens[0, dgvtokens.RowCount - 1].Value = "60";
                        dgvtokens[1, dgvtokens.RowCount - 1].Value = Texto.ToString();
                        dgvtokens[2, dgvtokens.RowCount - 1].Value = "NUMERO ENTERO - NE";
                        dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();                       
                    }
                    else if (AnalizarLetra(Cadena[i]))
                    {
                        Texto = Cadena[i].ToString();
                        PR(Texto); //Llamamos ah un Procedimiento Palabra Reservada -PR para Confirmar si es una PR                         
                    }
                    else
                    {
                        AnalizarSimbolo(Cadena[i].ToString(), x);
                    }
                    Texto = "";
                    i++;
                }
               
            }
            richTextBox2.Text = (Erro) ? "Analisis Lexico INCORRECTO" : "Analisis Lexico CORRECTO";
        }

        private void AnalizarSimbolo(string Union, int PosEmpieza)
        {
            int flag = -1;
            int Pos = -1;
            for (int i = 29; i < Simbolo.Length; i++)
            {
                if (Simbolo[i] == Union)
                {
                    flag = 1;
                    Pos = i;
                    break;
                }
            }
            //Verificamos si el Simbolo Pertenece al Lp
            if (flag > -1)
            {
                dgvtokens.RowCount = dgvtokens.RowCount + 1;
                dgvtokens[0, dgvtokens.RowCount - 1].Value = Codigo[Pos];
                dgvtokens[1, dgvtokens.RowCount - 1].Value = Union.ToString();               
                dgvtokens[2, dgvtokens.RowCount - 1].Value = Tokens[Pos];
                dgvtokens[3, dgvtokens.RowCount - 1].Value = (PosEmpieza + 1).ToString();               
            }
            else
            {
                Erro = true;
                dgvtokens.RowCount = dgvtokens.RowCount + 1;
                dgvtokens[0, dgvtokens.RowCount - 1].Value = "64";
                dgvtokens[1, dgvtokens.RowCount - 1].Value = Union.ToString();
                dgvtokens[2, dgvtokens.RowCount - 1].Value = "SIMBOLO DESCONOCIDO - SD";
                dgvtokens[3, dgvtokens.RowCount - 1].Value = (PosEmpieza + 1).ToString();
                dgvErrores.RowCount = dgvErrores.RowCount + 1;
                dgvErrores[0, dgvErrores.RowCount - 1].Value = "1";
                dgvErrores[1, dgvErrores.RowCount - 1].Value = Union.ToString();               
                dgvErrores[2, dgvErrores.RowCount - 1].Value = (PosEmpieza + 1).ToString();
            }
        }
        private void PR(string Texto)
        {
            int flag = -1;
            int Pos = -1;
            for (int i = 0; i < Simbolo.Length; i++)
            {
                if (Simbolo[i] == Texto)
                {
                    flag = 1;
                    Pos = i;
                    break;
                }
            }
            if (flag > -1) // Confirmamos si es una PR
            {
                dgvtokens.RowCount = dgvtokens.RowCount + 1;
                dgvtokens[0, dgvtokens.RowCount - 1].Value = Codigo[Pos];
                dgvtokens[1, dgvtokens.RowCount - 1].Value = Texto.ToString();
                dgvtokens[2, dgvtokens.RowCount - 1].Value = Tokens[Pos];
                dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
            }
            else
            {
                dgvtokens.RowCount = dgvtokens.RowCount + 1;
                dgvtokens[0, dgvtokens.RowCount - 1].Value = "59";
                dgvtokens[1, dgvtokens.RowCount - 1].Value = Texto.ToString();
                dgvtokens[2, dgvtokens.RowCount - 1].Value = "VARIABLE O IDENTIFICADOR - ID";
                dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
            }
        }               

        private bool AnalizarNumero(char p)
        {
            bool Estado;
            switch (p.ToString())
            {
                case "0":
                case "1":
                case "2":
                case "3":
                case "4":
                case "5":
                case "6":
                case "7":
                case "8":
                case "9": Estado = true; break;
                default: Estado = false; break;
            }
            return Estado;
        }

        private bool AnalizarLetra(char p)
        {
            return char.IsLetter(p) ? true : false;
        }
    }
}

Zeroql

Muy bueno, un sistema de compilacion, intente hacer uno asi, pero me enrede, aunque se puede optimizar.
igual es muy bueno.
Dime y lo olvido, enseñame y lo recuerdo, involucrame y lo aprendo.
/.-ZEROQL.-\   -----  #937675#


.::IT::.

Grande "Choclo"  ;-) estoy seguro que me ah de servir en algun momento gracias por compartir!!!!!!!!
Simplemente .::IT::.

Choclito

de nada amigos para eso tamoz para compartir xD...!

argaMalo

quisiera q me ayudaras tengo problemas con dgvtokens me sale error. y necesito q me funcione ya q lo deseo utilizar

rubensin

de casualidad no tienes algun compilador en c sharp que me lo puedas pasar. gracias

rubensin

algun compilador porfavor que me  lo puedas pasar en c sharp

.::IT::.

Cita de: rubensin en  9 Mayo 2014, 05:16 AM
algun compilador porfavor que me  lo puedas pasar en c sharp

Puedes probar http://roslyn.codeplex.com/
Simplemente .::IT::.