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); }
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); } }
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); }