public void parseVariable(Variable variable) { if (variable == null || variable.isParsed()) { return; } //Se obtiene la posición del tipo de dato equivalente del cubo semántico que le dió a la variable el Parser int posSemCube = cuboSemantico.getCubePosition(variable.getType()); variable.setType(posSemCube); //Se guarda el nuevo valor de su tipo de dato variable.setParsed(); //Se indica que ya fue parseada esta variable }
//Función que agrega un nuevo elemento a la pila de símbolos y su tipo a la pila de tipos public void pushSymbolStack(Variable variable) { //Verifica si la variable ya fue parseada (traducida a valores de cubo semántico) para que no tenga //que volverse a traducir if (!variable.isParsed()) { parseVariable(variable); } //Se le hace push a la pila de símbolos symbolStack.Push(variable); }
public bool assignlocalAddress(Variable var) { int tempAddress = 0; if (var.isParsed()) { switch (var.getType()) { case OperationTypes.TYPE_BOOL: tempAddress = addressManager.getBoolAddress(); break; case OperationTypes.TYPE_FLOAT: tempAddress = addressManager.getFloatAddress(); break; case OperationTypes.TYPE_INT: tempAddress = addressManager.getIntAddress(); break; case OperationTypes.TYPE_STRING: tempAddress = addressManager.getStringAddress(); break; default: var.setAddress(OperationTypes.TYPE_UNDEFINED); return(false); } } else { switch (var.getType()) { case Parser._CTE_I: tempAddress = addressManager.getConstIntAddress(); break; case Parser._CTE_F: tempAddress = addressManager.getConstFloatAddress(); break; case Parser._CTE_S: tempAddress = addressManager.getConstStringAddress(); break; case Parser._Int: tempAddress = addressManager.getIntAddress(); break; case Parser._Float: tempAddress = addressManager.getFloatAddress(); break; case Parser._Bool: tempAddress = addressManager.getBoolAddress(); break; case Parser._String: tempAddress = addressManager.getStringAddress(); break; default: var.setAddress(OperationTypes.TYPE_UNDEFINED); return(false); } } var.setAddress(tempAddress); return(true); }
//Función que se ejecuta al final de mandar llamar la función public bool solveFunction() { //Se elimina la función de la pila de funciones Function funcion = popFunctionStack(); //Si no existe ningúna función, no se hace nada if (funcion == null) { return(false); } //Si la cantidad de parámetros que se escribieron es diferente a la cantidad de parámetros de la función if (funcion.getSize() != funcArgCount - 1) { return(false); } //Se genera el cuádruplo goSub GoSub goSub = new GoSub(funcion); //Se obtiene la variable donde se guarda el retorno Variable returnFunctVariable = funcion.getReturnVariable(); //pushSymbolStack(funcion.getReturnVariable()); //Se escribe el cuadruplo del goSub writeIntermediateCode(goSub); //Se parsea la variable de retorno parseVariable(returnFunctVariable); //Si el tipo de retorno de la función está definido if (returnFunctVariable != null && returnFunctVariable.getType() != OperationTypes.TYPE_UNDEFINED) { //Se genera una variable temporal para que guarde el valor del retorno Variable returnTempVariable = getTempVar(returnFunctVariable.getType(), returnFunctVariable.isParsed()); //Se crea la asignación para guardar el resultado de la ejecución de la pila createIntermediateCodeNoTemp(OperationTypes.EQUAL, funcion.getReturnVariable(), returnTempVariable); //Se hace push a la pila porque se está mandando llamar pushSymbolStack(returnTempVariable); } //Como ya se mandó llamar, se resetea el contador de los argumentos funcArgCount = 1; return(true); }