void ManejadorClass::escribirDeclararConstante(Simbolo* simbolo) { stringstream operando; operando << simbolo->getIdentificador(); operando << " " << obtenerTipo(simbolo->getTipo()); operando << " = "; switch(simbolo->getTipo()) { case T_ENTERO: operando << simbolo->getValor<int>(); break; case T_REAL: operando << simbolo->getValor<double>(); break; case T_BOOLEANO: operando << simbolo->getValor<bool>(); break; case T_CADENA: operando << (simbolo->getValor<string>()); break; case T_CARACTER: operando << simbolo->getValor<char>(); break; default: operando << "ERROR VALOR CONSTANTE"; break; } globales.push_back(simbolo); aniadirInstruccion(".field static public final", operando.str()); }
void ManejadorClass::escribirDeclararVariableGlobal(Simbolo* simbolo) { stringstream operando; unsigned int cantDimensiones; operando << simbolo->getIdentificador() << " "; cantDimensiones = simbolo->getCantidadDimensiones(); for(unsigned int i = 0; i < cantDimensiones; ++i) { operando << "["; } operando << obtenerTipo(simbolo->getTipo()); aniadirInstruccion(".field static public", operando.str()); //añadir a nuestro compendio de llamables donde sea globales.push_back(simbolo); }
string ManejadorClass::obtenerDescriptorFirma(const string& firma, Tipo retorno) { stringstream flujo; int longitud = firma.length(); flujo << '('; for(int i = 0; i < longitud; ++i) { flujo << obtenerTipo(firma[i]); } flujo << ')'; flujo << obtenerTipo(retorno); return flujo.str(); }
void ManejadorClass::escribirLlamadaVarGlobal(Simbolo* simbolo, bool almacenar) { stringstream llamada; string operacion; if(almacenar) operacion = " putstatic"; else operacion = " getstatic"; llamada << nombreClase << " " << simbolo->getIdentificador() << " "; for(unsigned int i = 0; i < simbolo->getCantidadDimensiones(); ++i) { llamada << "["; } llamada << obtenerTipo(simbolo->getTipo()); aniadirInstruccion(operacion, llamada.str()); }
void ManejadorClass::escribirDeclararArray(Simbolo* temp, bool global) { if(temp->getCantidadDimensiones() > 0) { unsigned int cantDimen = temp->getCantidadDimensiones(); string operacion; stringstream operando; stringstream firmaDimensional; stringstream nombreCompleto; //ls locales ya fueron apilando sus valores if(global) { for(unsigned int i = 0; i < cantDimen; ++i) { //apilar las dimensiones escribirEnteroConstante(temp->getTamanioDimension(i)); } } if(cantDimen == 1) { if(temp->getTipo() == T_CADENA) operacion = " anewarray"; else operacion = " newarray"; switch(temp->getTipo()) { case T_ENTERO: operando << "int"; break; case T_REAL: operando << "double"; break; case T_CARACTER: operando << "char"; break; case T_BOOLEANO: operando << "boolean"; break; case T_CADENA: operando << "java/lang/String"; break; default: operando << "ERROR TIPO"; break; } firmaDimensional << "[" << obtenerTipo(temp->getTipo()); } else { operacion = " multianewarray"; for(unsigned int i = 0; i < cantDimen; ++i) { firmaDimensional << "["; } firmaDimensional << obtenerTipo(temp->getTipo()); operando << firmaDimensional.str() << " " << cantDimen; } aniadirInstruccion(operacion, operando.str()); nombreCompleto << nombreClase << " " << temp->getIdentificador() << " " << firmaDimensional.str(); if(global) { aniadirInstruccion(" putstatic", nombreCompleto.str()); } else { string oper = " astore"; stringstream pos; pos << obtenerPosLocal(temp->getAlias()); aniadirInstruccion(oper, pos.str()); } } }
map<string, Funcion*>* FuncionesIncorporadas::obtenerFuncionesIncorporadas() { /*¿Como manejar el tipo de retorno? ... Like a Boss!*/ bool compilarNxt = Programa::obtenerInstancia()->obtenerTipoDeCompilacion(); map<string, Funcion*> *funcionesIncorporadas = new map<string, Funcion*>(); /*Escriba!*/ (*funcionesIncorporadas)["escriba|entero"] = new Funcion( 0, obtenerVectorParametros(1, TEntero)); (*funcionesIncorporadas)["escriba|flotante"] = new Funcion( 0, obtenerVectorParametros(1, TFlotante)); (*funcionesIncorporadas)["escriba|caracter"] = new Funcion( 0, obtenerVectorParametros(1, TCaracter)); (*funcionesIncorporadas)["escriba|cadena"] = new Funcion( 0, obtenerVectorParametros(1, TCadena)); (*funcionesIncorporadas)["escriba|booleano"] = new Funcion( 0, obtenerVectorParametros(1, TBooleano)); if( compilarNxt ) { (*funcionesIncorporadas)["escriba|entero,entero,entero"] = new Funcion( 0, obtenerVectorParametros(3, TEntero, TEntero, TEntero)); (*funcionesIncorporadas)["escriba|flotante,entero,entero"] = new Funcion( 0, obtenerVectorParametros(3, TFlotante, TEntero, TEntero)); (*funcionesIncorporadas)["escriba|caracter,entero,entero"] = new Funcion( 0, obtenerVectorParametros(3, TCaracter, TEntero, TEntero)); (*funcionesIncorporadas)["escriba|cadena,entero,entero"] = new Funcion( 0, obtenerVectorParametros(3, TCadena, TEntero, TEntero)); (*funcionesIncorporadas)["escriba|booleano,entero,entero"] = new Funcion( 0, obtenerVectorParametros(3, TBooleano, TEntero, TEntero)); /*Con Retorno*/ /*Leer*/ /*********************************************************************************/ /*Lego NXT*/ /*Funciones incorporadas para LCD*/ (*funcionesIncorporadas)["limpiar_pantalla"] = new Funcion(0 , obtenerVectorParametros(0) ); /*Funciones Incorporadas para MOTORES*/ /*Adelante*/ (*funcionesIncorporadas)["adelante|motor"] = new Funcion(0 , obtenerVectorParametros(1, TMotor)); /*Atras*/ (*funcionesIncorporadas)["atras|motor"] = new Funcion(0 , obtenerVectorParametros(1, TMotor)); /*Detener*/ (*funcionesIncorporadas)["detener|motor"] = new Funcion(0 , obtenerVectorParametros(1, TMotor)); (*funcionesIncorporadas)["detener|motor,booleano"] = new Funcion(0 , obtenerVectorParametros(2, TMotor, TBooleano)); /*RotarMotor*/ (*funcionesIncorporadas)["rotar_motor|motor,entero"] = new Funcion(0 , obtenerVectorParametros(2, TMotor, TEntero)); /*RotarMotorConRetorno*/ (*funcionesIncorporadas)["rotar_motor|motor,entero,booleano"] = new Funcion(0 , obtenerVectorParametros(3, TMotor, TEntero, TBooleano)); /*RotarMotorHacia*/ (*funcionesIncorporadas)["rotar_motor_hacia|motor,entero"] = new Funcion(0 , obtenerVectorParametros(2, TMotor, TEntero)); /*RotarMotorHaciaConRetorno*/ (*funcionesIncorporadas)["rotar_motor_hacia|motor,entero,booleano"] = new Funcion(0 , obtenerVectorParametros(3, TMotor, TEntero,TBooleano)); /*Establecer Velocidad*/ (*funcionesIncorporadas)["establecer_velocidad|motor,entero"] = new Funcion(0 , obtenerVectorParametros(2, TMotor, TEntero)); /*Obtener Angulo*/ (*funcionesIncorporadas)["obtener_angulo|motor"] = new Funcion( obtenerTipo(TEntero) , obtenerVectorParametros(1, TMotor)); /*Obtener Velocidad*/ (*funcionesIncorporadas)["obtener_velocidad|motor"] = new Funcion( obtenerTipo(TEntero) , obtenerVectorParametros(1, TMotor)); /*EstaEnMovimiento*/ (*funcionesIncorporadas)["esta_en_movimiento|motor"] = new Funcion( obtenerTipo(TBooleano), obtenerVectorParametros(1, TMotor)); /*Bloquear*/ (*funcionesIncorporadas)["bloquear|motor,entero"] = new Funcion(0 , obtenerVectorParametros(2, TMotor, TEntero)); /*EsperarCompletacion???*/ /*Funciones Incorporadas para SENSORES*/ /*Sensor Ultrasonico*/ (*funcionesIncorporadas)["obtener_distancia|ultrasonico"] = new Funcion( obtenerTipo(TEntero), obtenerVectorParametros(1, TSensorUltrasonico)); /*Sensor de Tacto*/ (*funcionesIncorporadas)["esta_presionado|tacto"] = new Funcion( obtenerTipo(TBooleano), obtenerVectorParametros(1, TSensorDeTacto)); /*Sensor de Luz*/ (*funcionesIncorporadas)["obtener_luz|luz"] = new Funcion( obtenerTipo(TEntero), obtenerVectorParametros(1, TSensorDeLuz)) ; (*funcionesIncorporadas)["establecer_inundacion|luz,booleano"] = new Funcion( obtenerTipo(TEntero), obtenerVectorParametros(2, TSensorDeLuz, TBooleano) ); /*Sensor de Color*/ /*Sensor de Inclinacion*/ /*Sensor de Sonido ? */ /*Sensor Giroscopico ?*/ /*Sensor de Brujula ? */ /*Funciones INCORPORADAS PARA BOTONES DE NXT*/ /*Izq, Der, enter, escape*/ // Eventos Test... (*funcionesIncorporadas)["cuando_se_presione|boton_derecho,funcion"] = new Funcion(0, obtenerVectorParametros(2, TBotonDerecho, _TFuncion)); (*funcionesIncorporadas)["cuando_se_presione|boton_izquierdo,funcion"] = new Funcion(0, obtenerVectorParametros(2, TBotonDerecho, _TFuncion)); (*funcionesIncorporadas)["cuando_se_presione|boton_central,funcion"] = new Funcion(0, obtenerVectorParametros(2, TBotonDerecho, _TFuncion)); (*funcionesIncorporadas)["cuando_se_presione|boton_escape,funcion"] = new Funcion(0, obtenerVectorParametros(2, TBotonDerecho, _TFuncion)); // esta presionado (*funcionesIncorporadas)["esta_presionado|boton_derecho"] = new Funcion(obtenerTipo(TBooleano), obtenerVectorParametros(1, TBotonDerecho)); (*funcionesIncorporadas)["esta_presionado|boton_izquierdo"] = new Funcion(obtenerTipo(TBooleano), obtenerVectorParametros(1, TBotonIzquierdo)); (*funcionesIncorporadas)["esta_presionado|boton_central"] = new Funcion(obtenerTipo(TBooleano), obtenerVectorParametros(1, TBotonCentral)); (*funcionesIncorporadas)["esta_presionado|boton_escape"] = new Funcion(obtenerTipo(TBooleano), obtenerVectorParametros(1, TBotonEscape)); // EsperarPresion (*funcionesIncorporadas)["esperar_presion|boton_derecho"] = new Funcion(0, obtenerVectorParametros(1, TBotonDerecho)); (*funcionesIncorporadas)["esperar_presion|boton_izquierdo"] = new Funcion(0, obtenerVectorParametros(1, TBotonIzquierdo)); (*funcionesIncorporadas)["esperar_presion|boton_central"] = new Funcion(0, obtenerVectorParametros(1, TBotonCentral)); (*funcionesIncorporadas)["esperar_presion|boton_escape"] = new Funcion(0, obtenerVectorParametros(1, TBotonEscape)); // EsperarPresionYLiberacion (*funcionesIncorporadas)["esperar_presion_liberacion|boton_derecho"] = new Funcion(0, obtenerVectorParametros(1, TBotonDerecho)); (*funcionesIncorporadas)["esperar_presion_liberacion|boton_izquierdo"] = new Funcion(0, obtenerVectorParametros(1, TBotonIzquierdo)); (*funcionesIncorporadas)["esperar_presion_liberacion|boton_central"] = new Funcion(0, obtenerVectorParametros(1, TBotonCentral)); (*funcionesIncorporadas)["esperar_presion_liberacion|boton_escape"] = new Funcion(0, obtenerVectorParametros(1, TBotonEscape)); // Delay (*funcionesIncorporadas)["esperar|entero"] = new Funcion( 0, obtenerVectorParametros(1, TEntero) ); (*funcionesIncorporadas)["salir"] = new Funcion(0, obtenerVectorParametros(0)); // sonido! (*funcionesIncorporadas)["tono|entero,entero"] = new Funcion(0, obtenerVectorParametros(2, TEntero, TEntero)); (*funcionesIncorporadas)["tono|entero,entero,entero"] = new Funcion(0, obtenerVectorParametros(3, TEntero, TEntero, TEntero)); } /*Extras!*/ //Random (*funcionesIncorporadas)["numero_aleatorio|entero"] = new Funcion( obtenerTipo(TEntero), obtenerVectorParametros(1, TEntero) ); (*funcionesIncorporadas)["numero_aleatorio|entero,entero"] = new Funcion( obtenerTipo(TEntero), obtenerVectorParametros(2, TEntero, TEntero) ); // Delay //(*funcionesIncorporadas)["esperar|entero"] = new Funcion( 0, obtenerVectorParametros(1, TEntero) ); (*funcionesIncorporadas)["obtener_cantidad|arreglo"] = new Funcion( obtenerTipo(TEntero),obtenerVectorParametros(1, TArreglo) ); (*funcionesIncorporadas)["aentero|flotante"] = new Funcion(obtenerTipo(TEntero), obtenerVectorParametros(1, TFlotante)); return funcionesIncorporadas; }