예제 #1
0
        public override object Execute(Ambit ambit)
        {
            Identifier buscar = new Identifier();

            //BUSCA LA VARIABLE SI NO HA SIDO DECLARADA
            if (!ambit.Ambit_name_inmediato.Equals("Function") && !ambit.Ambit_name_inmediato.Equals("Procedure"))
            {
                buscar = ambit.getVariable(id);
            }
            //SIGFINICA QUE ES UNA DECLARACION EN FUNCION
            else
            {
                buscar = ambit.getVariableFunctionInAmbit(id);
            }

            if (buscar.IsNull)
            {
                try
                {
                    Returned val = this.value.Execute(ambit);

                    //VERIFICA QUE NO HAYA ERROR
                    if (val.getDataType == DataType.ERROR)
                    {
                        return(null);
                    }


                    if (this.type == DataType.CONST)
                    {
                        ambit.save(this.id, val.Value, val.getDataType, true, true, "Constante");
                        return(val.Value);
                    }
                    else
                    {
                        if (val.getDataType == this.type)
                        {
                            ambit.save(this.id, val.Value, val.getDataType, false, isAssigned, "Variable");
                            return(val.Value);
                        }
                        else
                        {
                            set_error("El tipo " + val.getDataType + " no es asignable con " + this.type.ToString(), row, column);
                            return(null);
                        }
                    }
                }
                catch (Exception)
                {
                }
            }
            else
            {
                set_error("La variable '" + id + "' ya fue declarada", row, column);
                return(null);
            }
            return(0);
        }
예제 #2
0
        public override object Execute(Ambit ambit)
        {
            try
            {
                var val = this.value.Execute(ambit);

                Identifier variableAmbit = ambit.getVariable(id);
                var        generator     = C3DController.Instance;



                /**
                 * VALIDAR EXISTENCIA
                 */
                if (!variableAmbit.IsNull)
                {
                    /**
                     * VERIFICA QUE NO SEA CONSTABTE
                     */
                    if (variableAmbit.Esconstante)
                    {
                        setError("No se puede cambiar el valor a una constante", row, column);
                        return(null);
                    }
                    else
                    {
                        assignation_string += val.Texto_anterior;

                        if (val == null || val.getDataType == DataType.ERROR)
                        {
                            return(null);
                        }

                        /**
                         * VALIDAR VALOR: VERIFICA SI EL TIPO DE LA VARIABLE ES IGUAL AL DEL VALOR A ASIGNAR
                         */
                        if (variableAmbit.DataType == val.getDataType)
                        {
                            if (val.IsTemporal)
                            {
                                ambit.free_temp(val.Value);
                            }

                            if (variableAmbit.IsGlobal)
                            {
                                if (variableAmbit.DataType == DataType.BOOLEAN)
                                {
                                    var templabel = generator.newLabel();
                                    assignation_string += generator.addLabel(val.TrueLabel, tabs);
                                    assignation_string += generator.set_stack(variableAmbit.Position.ToString(), "1", tabs);
                                    assignation_string += generator.add_Goto(templabel, tabs + 1);
                                    assignation_string += generator.addLabel(val.FalseLabel, tabs);
                                    assignation_string += generator.set_stack(variableAmbit.Position.ToString(), "0", tabs);
                                    assignation_string += generator.addLabel(templabel, tabs);
                                }
                                else
                                {
                                    var tempAux = variableAmbit.Position_global.ToString();
                                    if (variableAmbit.IsReference)
                                    {
                                        var temp = generator.newTemporal();
                                        assignation_string += generator.get_stack(temp, variableAmbit.Position_global.ToString(), tabs);
                                        generator.freeTemp(temp);
                                        tempAux = temp;
                                    }


                                    assignation_string += generator.set_stack(tempAux, val.getValue(), tabs);
                                }
                            }
                            else
                            {
                                var temp = generator.newTemporal();
                                ambit.set_temp(temp);
                                assignation_string += generator.addExpression(temp, "SP", variableAmbit.Position.ToString(), "+", tabs);


                                if (variableAmbit.IsReference)
                                {
                                    var newTemp = generator.newTemporal();
                                    ambit.set_temp(newTemp);
                                    ambit.free_temp(temp);
                                    generator.freeTemp(temp);
                                    assignation_string += generator.get_stack(newTemp, temp, tabs);
                                    temp = newTemp;
                                }



                                if (variableAmbit.DataType == DataType.BOOLEAN)
                                {
                                    generator.freeTemp(temp);
                                    var templabel = generator.newLabel();
                                    assignation_string += generator.addLabel(val.TrueLabel, tabs);
                                    assignation_string += generator.set_stack(temp, "1", tabs);
                                    assignation_string += generator.add_Goto(templabel, tabs + 1);
                                    assignation_string += generator.addLabel(val.FalseLabel, tabs);
                                    assignation_string += generator.set_stack(temp, "0", tabs);
                                    assignation_string += generator.addLabel(templabel, tabs);
                                }
                                else
                                {
                                    generator.freeTemp(temp);
                                    assignation_string += generator.set_stack(temp, val.getValue(), tabs);
                                }
                            }


                            return(assignation_string);
                        }
                        else
                        {
                            setError("El tipo " + val.getDataType + " no es asignable con " + variableAmbit.DataType, row, column);
                            return(null);
                        }
                    }
                }
                else
                {
                    Function function = ambit.getFuncion(id);
                    if (function != null)
                    {
                        if (function.IsProcedure)
                        {
                            setError("No puede asignarse ningun valor al procedimiento '" + id + "' ", row, column);
                            return(null);
                        }

                        /**
                         * VALIDAR VALOR: VERIFICA SI EL TIPO DE LA VARIABLE ES IGUAL AL DEL VALOR A ASIGNAR
                         */
                        if (function.Tipe == val.getDataType)
                        {
                            function.Retorno = val.getValue();
                            ambit.setFunction(Id, function);

                            assignation_string += val.Texto_anterior;
                            assignation_string += generator.set_stack("T13", function.Retorno, tabs);
                        }
                        else
                        {
                            setError("El tipo " + val.getDataType + " no es asignable con " + function.Tipo, row, column);
                            return(null);
                        }
                    }
                    else
                    {
                        setError("La variable '" + id + "' no esta declara", row, column);
                        return(null);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                ConsolaController.Instance.Add("Recuperado de error, Row:" + row + " Col: " + column);
                return(null);
            }
            return(assignation_string);
        }
        public override object Execute(Ambit ambit)
        {
            try
            {
                var val = this.value.Execute(ambit);

                if (val == null || val.getDataType == DataType.ERROR)
                {
                    return(null);
                }

                Identifier variable = ambit.getVariable(id);

                /**
                 * VALIDAR EXISTENCIA
                 */
                if (!variable.IsNull)
                {
                    /**
                     * VERIFICA QUE NO SEA CONSTABTE
                     */
                    if (variable.Esconstante)
                    {
                        setError("No se puede cambiar el valor a una constante", row, column);
                        return(null);
                    }
                    else
                    {
                        /**
                         * VALIDAR VALOR: VERIFICA SI EL TIPO DE LA VARIABLE ES IGUAL AL DEL VALOR A ASIGNAR
                         */
                        if (variable.DataType == val.getDataType)
                        {
                            ambit.setVariable(id, val.Value, val.getDataType, false, "Variable");
                            return(variable.Value);
                        }
                        else
                        {
                            setError("El tipo " + val.getDataType + " no es asignable con " + variable.DataType, row, column);
                            return(null);
                        }
                    }
                }
                else
                {
                    Function function = ambit.getFuncion(id);

                    if (function != null)
                    {
                        if (function.IsProcedure)
                        {
                            setError("No puede asignarse ningun valor al procedimiento '" + id + "' ", row, column);
                            return(null);
                        }

                        /**
                         * VALIDAR VALOR: VERIFICA SI EL TIPO DE LA VARIABLE ES IGUAL AL DEL VALOR A ASIGNAR
                         */
                        if (function.Tipe == val.getDataType)
                        {
                            function.Retorno = val.Value.ToString();
                            ambit.setFunction(Id, function);
                            return(new Returned(function.Retorno, function.Tipe));
                        }
                        else
                        {
                            setError("El tipo " + val.getDataType + " no es asignable con " + variable.DataType, row, column);
                            return(null);
                        }
                    }
                    else
                    {
                        setError("La variable '" + id + "' no esta declara", row, column);
                        return(null);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                ConsolaController.Instance.Add("Recuperado de error, Row:" + row + " Col: " + column);
                return(null);
            }
        }
예제 #4
0
        public override object Execute(Ambit ambit)
        {
            var forAmbit = new Ambit(ambit, ambit.Ambit_name, "For", false, ambit.IsFunction);



            //SE HACE LA ASIGNACION INICIAL
            Assignation assignation = new Assignation(initId, inicializacion, row, column, cant_tabs);

            Identifier identifier = ambit.getVariable(initId);

            var for_str = "";

            //VERIFICA QUE EL IDENTIFICADOR EXISTA
            if (!identifier.IsNull)
            {
                //VERIFICA QUE LA VARIABLE NO HAYA SIDO ASIGNADA EN LA DECLARACION
                if (!identifier.IsAssiged)
                {
                    var generator = C3D.C3DController.Instance;

                    var simb2 = (direccion.ToLower().Equals("to")) ? "+" : "-";
                    var simb  = (direccion.ToLower().Equals("to")) ? ">" : "<";


                    for_str += generator.save_comment("Inicia For", cant_tabs, false);

                    //ETIQUETA DE RECURRENCIA
                    //var recurrence_label = generator.newLabel();


                    //SE ASIGNA EL NUEVO VALOR A LA VARIABLE
                    for_str += assignation.Execute(forAmbit);


                    //IMPRIMRE TAG RECURRENCIA

                    //for_str += generator.save_comment(recurrence_label+ ": //Etiqueta Recurrencia", cant_tabs, false);


                    //SE CREA LA CONDICION
                    //Relational cond_temp = new Relational((new Access(initId, row, column, cant_tabs)), actualizacion, simb, row, column, cant_tabs);

                    var trueLabel = generator.newLabel();

                    var continueLabel = generator.newLabel();

                    var falseLabel = generator.newLabel();

                    var actual = actualizacion.Execute(forAmbit);

                    for_str += actual.Texto_anterior;
                    for_str += generator.addLabel(trueLabel, cant_tabs);

                    var acceso = (new Access(initId, row, column, cant_tabs)).Execute(forAmbit);
                    for_str += acceso.Texto_anterior;

                    for_str += generator.add_If(acceso.Value.ToString(), actual.Value, simb, falseLabel, cant_tabs);

                    forAmbit.Continue = continueLabel;
                    forAmbit.Break    = falseLabel;

                    //SE IMPRIMEN LAS INSTRUCCIONES

                    foreach (Instruction item in sentences)
                    {
                        var element = item.Execute(forAmbit);
                        if (element == null)
                        {
                            return(null);
                        }
                        for_str += element.ToString();
                    }



                    for_str += generator.addLabel(continueLabel, cant_tabs);

                    for_str += generator.addExpression(acceso.Value.ToString(),
                                                       acceso.Value.ToString(), "1", simb2, cant_tabs);


                    Assignation assignation1 = new Assignation(initId,
                                                               new Literal(acceso.Value.ToString(), 1, row, column, cant_tabs), row, column, cant_tabs);


                    for_str += (assignation1.Execute(forAmbit));


                    //goto a etiqueta verdadera
                    for_str += generator.add_Goto(trueLabel, cant_tabs);

                    //etiqueta falsa
                    for_str += generator.addLabel(falseLabel, cant_tabs);
                }
                else
                {
                    set_error("Variable de contador ilegal: La variable '" + initId + "' no debe estar inicializada al momento de su declaracion", row, column);
                    return(null);
                }
            }
            else
            {
                set_error("La variable '" + initId + "' no esta declarada.", row, column);
                return(null);
            }



            return(for_str);
        }