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