Beispiel #1
0
        public Variable addParamToFunction(Variable param)
        {
            //Variable auxiliar para saber si se encuentra o no en la tabla de variables local
            Variable auxParam = findVariableInLastScope(param.getName());

            //Se tuvo que regresar un null si es que esa variable no existe
            if (auxParam != null)
            {
                parser.ErrorHandler.SemErr("ERROR: Several declarations of " + param.getName());
                //Se regresa nulo en señal de error.
                return(null);
            }


            //Se agrega a la tabla de variables
            addVariable(param);

            codeGenerator.parseVariable(param);

            //assignlocalAddress(param);

            //Se agrega a la lista de parámetros de la función
            actualFunction.addParam(param);

            //Se regresa la variable
            return(param);
        }
Beispiel #2
0
        public void addGlobalVariable(Variable variable)
        {
            //Si la pila de variables está vacía
            if (variableStack.Count == 0)
            {
                //Se crea una nueva capa a la tabla de variables
                addVariableLayer(variable);

                assignGlobalAddress(variable);



                //Se termina la ejecución
                return;
            }

            Dictionary <string, Variable> lastVariable = getTopVariableStack();;

            foreach (Dictionary <string, Variable> i in variableStack)
            {
                lastVariable = i;
            }

            //Se intenta agregar la variable en el diccionario
            try {
                lastVariable.Add(variable.getName(), variable);
                assignGlobalAddress(variable);
            }
            catch (ArgumentException) {
                //En caso de que no se pueda, quiere decir que esa variable ya está declarada, por lo que se manda el error.
                parser.ErrorHandler.SemErr("Several declarations of " + variable.getName());
            }
        }
Beispiel #3
0
        //Función que agrega constantes a la tabla de constantes
        public Variable addConstant(Variable constante)
        {
            try {
                //Se agrega la constante al diccionario de constantes
                constantsDiccionary.Add(constante.getName(), constante);

                //Se asigna al objeto que es una constante
                constante.setConstant();

                //Se le asigna una dirección constante
                assignGlobalAddress(constante);

                //Se le asigna el valor de la constante
                constante.setValue(constante.getName());

                //Genera un cu{adruplo de asignación para que guarde el valor de la constante en memoria
                codeGenerator.createConstant(constante);
            }
            catch (ArgumentException) {
                //Si hubo un error (la constante ya estaba ahí) se regresa el objeto de constante
                return(constantsDiccionary[constante.getName()]);
            }
            //Se regresa la constante ya con sus campos llenos
            return(constante);
        }
Beispiel #4
0
        //Función paa agregar variables a la tabla de variables
        public void addVariable(Variable variable)
        {
            //Si la pila de variables está vacía
            if (variableStack.Count == 0)
            {
                //Se crea una nueva capa a la tabla de variables
                addVariableLayer(variable);

                assignGlobalAddress(variable);

                //Se termina la ejecución
                return;
            }

            //Si se encontró una variable con el mismo nombre
            if (findVariableInLastScope(variable.getName()) != null)
            {
                //Error, no se pueden tener variables con el mismo nombre en el mismo scope
                parser.ErrorHandler.SemErr("Sevaral declarations of " + variable.getName());
                return;
            }


            //Se obtiene la referencia a la primera variable del scope
            Dictionary <string, Variable> lastVariable = getTopVariableStack();

            //Si el top de la pila no es nulo, se agrega la variable al diccionario
            if (lastVariable != null)
            {
                try {
                    lastVariable.Add(variable.getName(), variable);
                }
                catch (ArgumentException) {
                    //Si no se puede agregar es que ya existe una variable con ese nombre
                    parser.ErrorHandler.SemErr("Sevaral declarations of " + variable.getName());
                    return;
                }
            }
            else
            {
                //Se quita el nulo de la capa
                removeVariableLayer();

                //Se le guarda la variable
                addVariableLayer(variable);
            }



            //Si la pila es de tamaño 1, solo hay variables globales
            if (variableStack.Count > 1)
            {
                assignlocalAddress(variable);
            }
            else
            {
                assignGlobalAddress(variable);
            }
        }
Beispiel #5
0
        public string getQuadruple()
        {
            if (returnVariable == null && returnValue != null)
            {
                return("RETURN, " + returnValue.getName() + ", _, " + " UNDEF");
            }
            else if (returnValue != null)
            {
                return("RETURN, " + returnValue.getName() + ", _, " + returnVariable.getName());
            }

            return("RETURN, " + "UNDEF" + ", _, " + "UNDEF");
        }
Beispiel #6
0
        //Función que agrega una nueva capa a la tabla de variables
        public void addVariableLayer(Variable variable)
        {
            Dictionary <string, Variable> aux = new Dictionary <string, Variable>();

            aux.Add(variable.getName(), variable);

            //Se le hace push al stack
            variableStack.Push(aux);
        }
Beispiel #7
0
        public string getQuadruple()
        {
            if (constant == null)
            {
                return("ASSIGN_CONSTANT,  _ _,_");
            }


            return("ASSIGN_CONSTANT, " + constant.getName() + ", _,_");
        }
Beispiel #8
0
        //Función que agrega un nuevo parámetro a la función actual
        public void addFunctParam(Variable variableParam)
        {
            //Si ya existe una variable que se llama igual, no puede ser
            if (findVariable(variableParam.getName()) != null)
            {
                parser.ErrorHandler.SemErr("Several declarations of " + variableParam.getName());
                //return;
            }

            //Si no hay parámetros, se agrega la variable a la tabla de variables la variable local
            //agregando una nueva capa a la pila
            if (actualFunction.getParam(1) == null)
            {
                addVariableLayer(variableParam);
            }
            else
            {
                //Si ya tiene parámetros, solo se agrega en su capa de la tabla de variables
                addVariable(variableParam);
            }

            //Se agrega el parámetro a la función
            actualFunction.addParam(variableParam);
        }
        //Función que genera los cuádruplos de la condición del Loop
        public bool createLoopCondition(Variable variable)
        {
            if (variable == null)
            {
                return(false);
            }

            Variable varReff;

            //Si lo que se recibió es una constante entera
            if (variable.getType() == Parser._CTE_I)
            {
                //Agrega la constante a la tabla de constantes
                varReff = varTable.addConstant(variable);
            }
            else
            {
                //Si no es constante, es una variable
                varReff = varTable.findVariable(variable.getName());
            }

            //La variable debe de existir
            if (varReff == null)
            {
                return(false);
            }

            //Variable que guarda la variable que vamos a comparar con cero
            Variable varToCompare;

            if (varReff.isConstant())
            {
                //Si se entregó una constante, se genera una variable auxiliar que es la que va a ir decrementándoce hasta llegar a cero
                Variable tempVarConstant = new Variable("1LOOP_AUX_VARIABLE", Parser._Int);

                //Se agrega esta variable a la tabla de variables
                varTable.addVariable(tempVarConstant);

                //Se parsea la variable
                parseVariable(tempVarConstant);

                //Se crea un cuádruplo donde se le asigna el valor de la constante a la variable auxiliar
                createIntermediateCodeNoTemp(OperationTypes.EQUAL, varReff, tempVarConstant);

                //Ahora sabemos que la variable a comparar es la que tiene el valor asignado de la constante
                varToCompare = tempVarConstant;
            }
            else
            {
                //Si fue una variable, se obtiene su referencia para que sea comparada en el ciclo
                varToCompare = varReff;
            }

            //Se obtiene la constante 0 para hacer la condición del Loop
            Variable constantCero = varTable.addConstant(new Variable("0", Parser._CTE_I, "0"));

            //Se hace push al stack de saltos indicando dónde está la comparación
            pushJumpStack(lineCont);

            //Se crea el cuádruplo <>. Variable, 0, tempX
            createIntermediateCode(OperationTypes.DIFFERENT_THAN, varToCompare, constantCero);

            //Se hace push al stack de saltos con un goToF por la condición
            pushGoToF(popSymnbolStack());

            return(true);
        }
Beispiel #10
0
 public string getQuadruple()
 {
     return("PRINT, _, _, " + variable.getName());
 }
Beispiel #11
0
 public string getQuadruple()
 {
     return("PARAM, " + numberParam.getName() + ", _, " + paramVariable.getName());
 }
Beispiel #12
0
 public string getQuadruple()
 {
     return(lineNumber + " GoToFalse, " + variable.getName() + ", _, " + jumpTo);
 }