Ejemplo n.º 1
0
        public string analizadorLexico()
        {
            int    iAm           = 0;
            int    iAf           = 0;
            bool   bConcordancia = false;
            string sCadEntrada   = this.txtCadena.Text;
            string sLexema       = string.Empty;
            string sToken        = string.Empty;
            string sRes          = string.Empty;
            string sRes2         = string.Empty;

            CBuscarConcordancia objCBuscarConcordancia = new CBuscarConcordancia();
            CAnalizadorLexico   objAnalizadorLexico    = new CAnalizadorLexico();

            lstvInfo.Items.Clear();

            if (this.txtCadena.Text != string.Empty)
            {
                while (sRes != "EOF")
                {
                    bConcordancia = objAnalizadorLexico.buscarConcordancia(sCadEntrada + "\x0", ref iAf, ref iAm, out sRes, out sRes2);

                    if (bConcordancia)
                    {
                        sLexema = string.Empty;
                        sLexema = CAnalizadorLexico.extraerLexema(sCadEntrada, ref iAf, ref iAm);

                        switch (sRes)
                        {
                        //Token Lexema Numeros
                        case "Numero":
                            sToken = objAnalizadorLexico.tokenLexema(sLexema, sRes, sRes2, "Numeros");
                            break;

                        //Token Lexema Identificador
                        case "Identificador":
                            sToken = objAnalizadorLexico.tokenLexema(sLexema, "Identificador");
                            break;

                        default:
                            sToken = "";
                            break;
                        }

                        if (sToken == string.Empty)
                        {
                            sToken = objAnalizadorLexico.tokenLexema(sCadEntrada, sLexema, ref iAf, ref iAm);
                            //Token de un Simbolo Reconocido
                            mostrarTokenLexema(lstvInfo, sLexema, sToken);
                        }
                        else
                        {
                            //Token de un Simbolo Reconocido
                            mostrarTokenLexema(lstvInfo, sLexema, sToken);
                        }
                        bConcordancia = true;
                        iAf           = iAm;              //Igualar la posicion de los dos apuntadores
                    }
                    else
                    {
                    }
                }                //Fin While

                //Regresar Token Fin de Archivo
                mostrarTokenLexema(lstvInfo, "EOF", "(0,0)");
            }
            else
            {
                MessageBox.Show("Cadena Vacia intentelo otra vez");
            }

            sToken = "Cadena Vacia";
            return(sToken);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Identifica cual es el patron de concordancia con el que encaja la cadena leida
        /// de la cadena de entrada
        /// </summary>
        /// <param name="parCadena">Cadena de Entrada proporcionada por el usuario</param>
        /// <param name="iAf">Apuntador Fijo en la cadena de entrada</param>
        /// <param name="iAm">Apuntador Movil en la cadena de entrada</param>
        /// <param name="sRes">Variable de control entre funciones</param>
        /// <param name="sRes2">Variable de control entre funciones</param>
        /// <returns>True si encontro una concordancia, FALSE en caso contrario</returns>
        public bool buscarConcordancia(string parCadena, ref int iAf, ref int iAm, out string sRes, out string sRes2)
        {
            string sCadena       = parCadena;
            string sLexema       = string.Empty;
            bool   bConcordancia = false;

            sRes  = string.Empty;
            sRes2 = string.Empty;
            char cCar = sCadena[iAm];

            CBuscarConcordancia objCBuscarConcordancia = new CBuscarConcordancia();
            CAnalizadorLexico   objCAnalizadorLexico   = new CAnalizadorLexico();

            //Espacios
            if (cCar == ' ')
            {
                cCar          = objCAnalizadorLexico.sgteCar(sCadena, ref iAm);
                bConcordancia = true;
            }            //Identificadores,Palabras Reservadas
            else if (objCBuscarConcordancia.IsEstadoTerminalPalabraReservada(sCadena, cCar, ref iAm) == true)
            {
                sLexema = CAnalizadorLexico.extraerLexema(sCadena, ref iAf, ref iAm);
                if (objCBuscarConcordancia.IsPalabraReservada(sLexema) == false)
                {
                    //Verificar si el Identificador ya existe para no agregarlo
                    if (objCBuscarConcordancia.IsExistsIdentificador(sLexema) == true)
                    {
                        sRes = "Identificador";
                    }                    //Identificador Nuevo
                    else
                    {
                        CCompoLex.iIdentificador.Add(sLexema);
                        sRes = "Identificador";
                    }
                }
                bConcordancia = true;
            }
            else if (objCBuscarConcordancia.IsNumero(sCadena, cCar, ref iAm, out sRes))
            {
                switch (sRes)
                {
                case "NumEntero":
                    bConcordancia = true;
                    //Agregar simbolo a la tabla
                    sLexema = extraerLexema(sCadena, ref iAf, ref iAm);
                    CCompoLex.NumerosEnteros.Add(sLexema);
                    sRes  = "Numero";
                    sRes2 = "Entero";
                    break;

                case "NumReal":
                    bConcordancia = true;
                    //Agregar simbolo a la tabla
                    sLexema = extraerLexema(sCadena, ref iAf, ref iAm);
                    CCompoLex.NumerosFlotantes.Add(sLexema);
                    sRes  = "Numero";
                    sRes2 = "Real";
                    break;

                case "NumExpCientifica":
                    bConcordancia = true;
                    //Agregar simbolo a la tabla
                    sLexema = extraerLexema(sCadena, ref iAf, ref iAm);
                    CCompoLex.NumerosNotacionCientifica.Add(sLexema);
                    sRes  = "Numero";
                    sRes2 = "NotacionCientifica";
                    break;

                default:
                    sRes  = "";
                    sRes2 = "";
                    break;
                }
            }
            //Operador Aritmetico
            else if (objCBuscarConcordancia.IsEstadoTerminalOpAritmetico(sCadena, cCar, ref iAf, ref iAm) == true)
            {
                bConcordancia = true;
            }            //Operador Logico
            else if (objCBuscarConcordancia.IsEstadoTerminalOpLogico(sCadena, cCar, ref iAf, ref iAm) == true)
            {
                bConcordancia = true;
            }            //Operador Relacional
            else if (objCBuscarConcordancia.IsEstadoTerminalOpRelacional(sCadena, cCar, ref iAf, ref iAm) == true)
            {
                bConcordancia = true;
            }            //Operador Asignacion
            else if (objCBuscarConcordancia.IsopAsignacion(cCar) == true)
            {
                bConcordancia = true;
                cCar          = objCAnalizadorLexico.sgteCar(sCadena, ref iAm);
            }            //Parentesis Circular
            else if (objCBuscarConcordancia.IsParentesisCircular(cCar) == true)
            {
                bConcordancia = true;
                cCar          = objCAnalizadorLexico.sgteCar(sCadena, ref iAm);
            }            //Parentesis Cuadrado
            else if (objCBuscarConcordancia.IsParentesisCuadrado(cCar) == true)
            {
                bConcordancia = true;
                cCar          = objCAnalizadorLexico.sgteCar(sCadena, ref iAm);
            }            //Llaves
            else if (objCBuscarConcordancia.IsLlaves(cCar) == true)
            {
                bConcordancia = true;
                cCar          = objCAnalizadorLexico.sgteCar(sCadena, ref iAm);
            }            //Algun otro caracter especial
            else if (objCBuscarConcordancia.IsCaracterEspecial(cCar))
            {
                bConcordancia = true;
                cCar          = objCAnalizadorLexico.sgteCar(sCadena, ref iAm);
            }            //Fin de Linea
            else if (cCar == '\n')
            {
                bConcordancia = true;
                cCar          = objCAnalizadorLexico.sgteCar(sCadena, ref iAm);
            }            //Fin de Archivo
            else if (cCar == '\x0')
            {
                bConcordancia = false;
                sRes          = "EOF";
            }            //Simbolo no reconocido
            else
            {
                bConcordancia = true;
                cCar          = objCAnalizadorLexico.sgteCar(sCadena, ref iAm);
            }
            return(bConcordancia);
        }