Example #1
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);
        }