/// <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); }