public itemValor getValor(elementoEntorno elmen) { itemValor ob = new itemValor(); ob.setTypeNulo(); if (hayErrores()) { return(ob); } switch (hijos.Count) { case 0: if (lstAtributos.listaAtributos.Count > 0) { return(parseandoDato(lstAtributos.listaAtributos[0])); } else { tablaSimbolos.tablaErrores.insertErrorSyntax("[E] Se esperaba un valor ", new token()); return(ob); //hay un error } case 1: if (hijos[0].nombre.Equals("OPE_ARITME")) { return(hijos[0].ope_tipo(elmen)); } else if (hijos[0].nombre.Equals("OPE_TIPO")) { return(hijos[0].ope_tipo(elmen)); } else if (hijos[0].nombre.Equals("SI_SIMPLIFICADO")) { _SI_SIMPLIFICADO simplif = (_SI_SIMPLIFICADO)hijos[0]; return(simplif.getValor(elmen)); } else if (hijos[0].nombre.Equals("LEN")) { _LEN len = (_LEN)hijos[0]; return(len.getValor(elmen)); } //operador unario else if (lstAtributos.listaAtributos.Count > 0) { String signo = lstAtributos.getValItem(0); switch (signo) { //Logico case "-": negativo opNeg = new negativo(hijos[0], tablaSimbolos, lstAtributos.getToken(0)); return(opNeg.opNot(" Asignando valor Negativo", elmen)); case "!": Not opeNot = new Not(hijos[0], tablaSimbolos, lstAtributos.getToken(0)); return(opeNot.opNot("Not", elmen)); case "(": _E ope = (_E)hijos[0]; itemValor te = ope.getValor(elmen); return(te); default: tablaSimbolos.tablaErrores.insertErrorSyntax("[E]No se reconoció el signo", lstAtributos.getToken(0)); return(ob); } } else //ID_VAR_FUNC { nodoModelo busq = getNodo("ID_VAR_FUNC"); if (busq != null) { _ID_VAR_FUNC idFunc = (_ID_VAR_FUNC)busq; return(idFunc.getValor(elmen)); } tablaSimbolos.tablaErrores.insertErrorSyntax("[E]Se esperaba un signo para operación unaria", new token()); return(ob); } case 2: //operador binario if (lstAtributos.listaAtributos.Count > 0) { String signo = lstAtributos.getValItem(0); switch (signo) { //Aritmetica case "+": suma ope = new suma(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(ope.opSuma(elmen)); case "-": resta opeRes = new resta(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(opeRes.opResta(elmen)); case "*": multiplicacion opeMul = new multiplicacion(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(opeMul.opMultiplicacion(elmen)); case "/": division opeDiv = new division(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(opeDiv.opDivision(elmen)); case "^": potencia opePot = new potencia(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(opePot.opPotencia(elmen)); case "%": modulo opeModulo = new modulo(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(opeModulo.opModulo(elmen)); //Relacional case "==": IgualQue opeIgualacion = new IgualQue(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(opeIgualacion.opIgualacion("Igualación", elmen)); case "!=": DiferenteQue opeDiferenciacion = new DiferenteQue(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(opeDiferenciacion.opDiferenciacion("Diferenciación", elmen)); case ">": MayorQue opeMayor = new MayorQue(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(opeMayor.opMayorQue("Mayor Que", elmen)); case ">=": MayorIgualQue opeMayorIgual = new MayorIgualQue(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(opeMayorIgual.opMayorIgualQue("Mayor o Igual Que", elmen)); case "<": MenorQue opeMenor = new MenorQue(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(opeMenor.opMenorQue("Menor Que", elmen)); case "<=": MenorIgualQue opeMenorIgual = new MenorIgualQue(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(opeMenorIgual.opMenorIgualQue("Menor o Igual Que", elmen)); //logicas case "&&": And opeAnd = new And(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(opeAnd.opAnd("And", elmen)); case "||": Or opeOr = new Or(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0)); return(opeOr.opOr("Or", elmen)); default: tablaSimbolos.tablaErrores.insertErrorSyntax("[E]No se reconoció el sigono", lstAtributos.getToken(0)); return(ob); } } else { tablaSimbolos.tablaErrores.insertErrorSyntax("[E]Se esperaba un signo para operación binaria", new token()); return(ob); } default: return(ob); } }
/* |------------------------------------------------------------------------------------------------------------------- | EJECUCIÓN FINAL |------------------------------------------------------------------------------------------------------------------- | */ public override itemRetorno ejecutar(elementoEntorno tablaEntornos) /* |---------------------------- | EJECUTAR |---------------------------- | 0= normal | 1 = return; | 2 = break | 3 = continue | 4 = errores */ { itemRetorno retorno = new itemRetorno(0); if (hayErrores()) { return(retorno); } if (hijos.Count == 2) /* |---------------------------- | ID_VAR_FUNC + VAL */ { //PUNTERO DONDE VOY A GUARDAR EL VALOR _ID_VAR_FUNC nodoFunc = (_ID_VAR_FUNC)getNodo("ID_VAR_FUNC"); itemEntorno destino = nodoFunc.getDestino(tablaEntornos); //AHORA OBTENGO EL VALOR _VAL nodoVal = (_VAL)getNodo("VAL"); if (nodoVal != null) { if (destino != null) { itemValor valor = nodoVal.getValor(tablaEntornos, destino.tipo); if (destino.lstDimensionesAcceso.Count > 0) //viene la posición de un arreglo { asignarValorMatriz(destino, valor); } else { asignarValor(destino, valor); } } else { println("Me retorno un itemEntorno vacio, no podré asignar la variable prro"); } } else { println("no tiene nodo VAl"); } } else if (hijos.Count == 1) { if (lstAtributos.getToken(0).valLower.Equals("+")) /* |---------------------------- | ID_VAR_FUNC + sMas + sMas */ { if (hayErrores()) { return(retorno); } _ID_VAR_FUNC nodoFunc = (_ID_VAR_FUNC)getNodo("ID_VAR_FUNC"); itemEntorno destino = nodoFunc.getDestino(tablaEntornos); if (destino.lstDimensionesAcceso.Count > 0) //viene la posición de un arreglo { tablaSimbolos.tablaErrores.insertErrorSemantic("No se puede incrementar la matriz " + destino.nombre.val + " de tipo: " + destino.tipo.valLower, destino.nombre); } else { itemValor valor = nodoFunc.getValor(tablaEntornos); itemValor valor2 = new itemValor(); valor2.setValue(1); suma sumatoria = new suma(new _E("hijo1", tablaSimbolos), new _E("hijo2", tablaSimbolos), tablaSimbolos, lstAtributos.getToken(0)); itemValor resultado = sumatoria.opSumaExterna(tablaEntornos, valor, valor2); Object ObjParseado = resultado.getValorParseado(destino.tipo.valLower); if (ObjParseado != null) { destino.valor.valor = ObjParseado; return(retorno); } else { tablaSimbolos.tablaErrores.insertErrorSemantic("No se puede asignar un tipo :" + sumatoria.GetType() + " a la variable " + destino.nombre.val + " de tipo: " + destino.tipo.valLower, destino.nombre); return(retorno); } } } else /* |---------------------------- | ID_VAR_FUNC + smenos + smenos */ { if (hayErrores()) { return(retorno); } _ID_VAR_FUNC nodoFunc = (_ID_VAR_FUNC)getNodo("ID_VAR_FUNC"); itemEntorno destino = nodoFunc.getDestino(tablaEntornos); if (destino.lstDimensionesAcceso.Count > 0) //viene la posición de un arreglo { tablaSimbolos.tablaErrores.insertErrorSemantic("No se puede incrementar la matriz " + destino.nombre.val + " de tipo: " + destino.tipo.valLower, destino.nombre); } else { itemValor valor = nodoFunc.getValor(tablaEntornos); itemValor valor2 = new itemValor(); valor2.setValue(1); resta sumatoria = new resta(new _E("hijo1", tablaSimbolos), new _E("hijo2", tablaSimbolos), tablaSimbolos, lstAtributos.getToken(0)); itemValor resultado = sumatoria.opRestaExterna(tablaEntornos, valor, valor2); Object ObjParseado = resultado.getValorParseado(destino.tipo.valLower); if (ObjParseado != null) { destino.valor.valor = ObjParseado; return(retorno); } else { tablaSimbolos.tablaErrores.insertErrorSemantic("No se puede asignar un tipo :" + sumatoria.GetType() + " a la variable " + destino.nombre.val + " de tipo: " + destino.tipo.valLower, destino.nombre); return(retorno); } } } } return(retorno); }
public nodoModelo getNodo(String nombreNoTerminal, tablaSimbolos tabla) { nodoModelo retorno = null; switch (nombreNoTerminal) { case "S": retorno = new _S(nombreNoTerminal, tabla); break; case "LST_IMPORT": retorno = new _LST_IMPORT(nombreNoTerminal, tabla); break; case "IMPORT": retorno = new _IMPORT(nombreNoTerminal, tabla); break; case "LST_CLASE": retorno = new _LST_CLASE(nombreNoTerminal, tabla); break; case "CLASE": retorno = new _CLASE(nombreNoTerminal, tabla); break; case "TIPO": retorno = new _TIPO(nombreNoTerminal, tabla); break; case "EXTENDER": retorno = new _EXTENDER(nombreNoTerminal, tabla); break; case "VISIBILIDAD": retorno = new _VISIBILIDAD(nombreNoTerminal, tabla); break; case "LST_PARAMETROS": retorno = new _LST_PARAMETROS(nombreNoTerminal, tabla); break; case "PARAMETRO": retorno = new _PARAMETRO(nombreNoTerminal, tabla); break; case "LST_VAL": retorno = new _LST_VAL(nombreNoTerminal, tabla); break; case "CP_CLASE": retorno = new _CP_CLASE(nombreNoTerminal, tabla); break; case "CUERPO_CLASE": retorno = new _CUERPO_CLASE(nombreNoTerminal, tabla); break; case "METODO": retorno = new _METODO(nombreNoTerminal, tabla); break; case "SOBRESCRITURA": retorno = new _SOBRESCRITURA(nombreNoTerminal, tabla); break; case "MAIN": retorno = new _MAIN(nombreNoTerminal, tabla); break; case "CONSTRUCTOR": retorno = new _CONSTRUCTOR(nombreNoTerminal, tabla); break; case "DECLARAR_VARIABLE_GLOBAL": retorno = new _DECLARAR_VARIABLE_GLOBAL(nombreNoTerminal, tabla); break; case "DECLARAR_VARIABLE_SINVISIBI": retorno = new _DECLARAR_VARIABLE_SINVISIBI(nombreNoTerminal, tabla); break; case "VAL": retorno = new _VAL(nombreNoTerminal, tabla); break; case "LST_LLAVES_VAL": retorno = new _LST_LLAVES_VAL(nombreNoTerminal, tabla); break; case "LLAVES_VAL_P": retorno = new _LLAVES_VAL_P(nombreNoTerminal, tabla); break; case "VAR_ARREGLO": retorno = new _VAR_ARREGLO(nombreNoTerminal, tabla); break; case "LST_CORCHETES": retorno = new _LST_CORCHETES(nombreNoTerminal, tabla); break; case "LST_CORCHETES_VAL": retorno = new _LST_CORCHETES_VAL(nombreNoTerminal, tabla); break; case "USAR_METO_VAR": retorno = new _USAR_METO_VAR(nombreNoTerminal, tabla); break; case "USAR_VARIABLEP": retorno = new _USAR_VARIABLEP(nombreNoTerminal, tabla); break; case "USAR_VARIABLE": retorno = new _USAR_VARIABLE(nombreNoTerminal, tabla); break; case "USAR_METODO": retorno = new _USAR_METODO(nombreNoTerminal, tabla); break; case "LLAMADA_FORMULARIO": retorno = new _LLAMADA_FORMULARIO(nombreNoTerminal, tabla); break; case "LST_CUERPO": retorno = new _LST_CUERPO(nombreNoTerminal, tabla); break; case "CUERPO": retorno = new _CUERPO(nombreNoTerminal, tabla); break; case "VALOR": retorno = new _VALOR(nombreNoTerminal, tabla); break; case "PAR_CORCHETES_VACIOS": retorno = new _PAR_CORCHETES_VACIOS(nombreNoTerminal, tabla); break; case "E": retorno = new _E(nombreNoTerminal, tabla); break; case "FUNCIONES_NATIVAS": retorno = new _FUNCIONES_NATIVAS(nombreNoTerminal, tabla); break; case "IMPRIMIR": retorno = new _IMPRIMIR(nombreNoTerminal, tabla); break; case "ID_VAR_FUNC": retorno = new _ID_VAR_FUNC(nombreNoTerminal, tabla); break; case "LST_PUNTOSP": retorno = new _LST_PUNTOSP(nombreNoTerminal, tabla); break; case "ASIG_VALOR": retorno = new _ASIG_VALOR(nombreNoTerminal, tabla); break; case "PAR_CORCHETES_VAL": retorno = new _PAR_CORCHETES_VAL(nombreNoTerminal, tabla); break; case "RETORNO": retorno = new _RETORNO(nombreNoTerminal, tabla); break; case "SI": retorno = new _SI(nombreNoTerminal, tabla); break; case "SINO_SI": retorno = new _SINO_SI(nombreNoTerminal, tabla); break; case "SINO": retorno = new _SINO(nombreNoTerminal, tabla); break; case "SENTENCIAS": retorno = new _SENTENCIAS(nombreNoTerminal, tabla); break; case "SI_SIMPLIFICADO": retorno = new _SI_SIMPLIFICADO(nombreNoTerminal, tabla); break; case "CASO": retorno = new _CASO(nombreNoTerminal, tabla); break; case "CUERPO_CASE": retorno = new _CUERPO_CASE(nombreNoTerminal, tabla); break; case "ROMPER": retorno = new _ROMPER(nombreNoTerminal, tabla); break; case "WHILE": retorno = new _WHILE(nombreNoTerminal, tabla); break; case "CONTINUAR": retorno = new _CONTINUAR(nombreNoTerminal, tabla); break; case "FOR": retorno = new _FOR(nombreNoTerminal, tabla); break; case "DOWHILE": retorno = new _DOWHILE(nombreNoTerminal, tabla); break; case "REPETIR": retorno = new _REPETIR(nombreNoTerminal, tabla); break; case "MENSAJE": retorno = new _MENSAJE(nombreNoTerminal, tabla); break; case "TO_CADENA": retorno = new _TO_CADENA(nombreNoTerminal, tabla); break; case "SUB_CAD": retorno = new _SUB_CAD(nombreNoTerminal, tabla); break; case "POS_CAD": retorno = new _POS_CAD(nombreNoTerminal, tabla); break; case "TO_BOOLEAN": retorno = new _TO_BOOLEAN(nombreNoTerminal, tabla); break; case "TO_ENTERO": retorno = new _TO_ENTERO(nombreNoTerminal, tabla); break; case "HOY": retorno = new _HOY(nombreNoTerminal, tabla); break; case "AHORA": retorno = new _AHORA(nombreNoTerminal, tabla); break; case "TO_FECHA": retorno = new _TO_FECHA(nombreNoTerminal, tabla); break; case "TO_HORA": retorno = new _TO_HORA(nombreNoTerminal, tabla); break; case "TO_FECHAHORA": retorno = new _TO_FECHAHORA(nombreNoTerminal, tabla); break; case "TAM": retorno = new _TAM(nombreNoTerminal, tabla); break; case "RANDOM": retorno = new _RANDOM(nombreNoTerminal, tabla); break; case "MIN": retorno = new _MIN(nombreNoTerminal, tabla); break; case "MAX": retorno = new _MAX(nombreNoTerminal, tabla); break; case "OPE_TIPO": retorno = new _OPE_TIPO(nombreNoTerminal, tabla); break; case "OPE_ARITME": retorno = new _OPE_ARITME(nombreNoTerminal, tabla); break; case "POTENCIA": retorno = new _POTENCIA(nombreNoTerminal, tabla); break; case "LOGARITMO": retorno = new _LOGARITMO(nombreNoTerminal, tabla); break; case "LOGARITMO10": retorno = new _LOGARITMO10(nombreNoTerminal, tabla); break; case "ABSOLUTO": retorno = new _ABSOLUTO(nombreNoTerminal, tabla); break; case "SENO": retorno = new _SENO(nombreNoTerminal, tabla); break; case "COSENO": retorno = new _COSENO(nombreNoTerminal, tabla); break; case "TANGENTE": retorno = new _TANGENTE(nombreNoTerminal, tabla); break; case "RAIZ": retorno = new _RAIZ(nombreNoTerminal, tabla); break; case "PI": retorno = new _PI(nombreNoTerminal, tabla); break; case "SUPER": retorno = new _SUPER(nombreNoTerminal, tabla); return(retorno); case "FORMULARIO": retorno = new _FORMULARIO(nombreNoTerminal, tabla); return(retorno); case "PREGUNTA": retorno = new _PREGUNTA(nombreNoTerminal, tabla); return(retorno); case "GRUPO": retorno = new _GRUPO(nombreNoTerminal, tabla); return(retorno); case "LST_CUERPO_PREGUNTA": retorno = new _LST_CUERPO_PREGUNTA(nombreNoTerminal, tabla); return(retorno); case "CUERPO_PREGUNTA": retorno = new _CUERPO_PREGUNTA(nombreNoTerminal, tabla); return(retorno); case "PREGUNTA_NATIVA": retorno = new _PREGUNTA_NATIVA(nombreNoTerminal, tabla); return(retorno); case "ESCRIBIR_ARCHIVO": retorno = new _ESCRIBIR_ARCHIVO(nombreNoTerminal, tabla); return(retorno); case "FUNC_MULTIMEDIA": retorno = new _FUNC_MULTIMEDIA(nombreNoTerminal, tabla); return(retorno); case "AUDIO": retorno = new _AUDIO(nombreNoTerminal, tabla); return(retorno); case "VIDEO": retorno = new _VIDEO(nombreNoTerminal, tabla); return(retorno); case "IMAGEN": retorno = new _IMAGEN(nombreNoTerminal, tabla); return(retorno); case "LEN": retorno = new _LEN(nombreNoTerminal, tabla); return(retorno); default: retorno = new nodoModelo("Desc_" + nombreNoTerminal, tabla); Console.WriteLine("[generarArbol]No se encontró el nodo:" + nombreNoTerminal); break; } return(retorno); }