예제 #1
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);
            }
        }