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);
        }
示例#3
0
        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);
        }