00001 package plp.orientadaObjetos1.comando; 00002 00003 import plp.expressions2.memory.VariavelJaDeclaradaException; 00004 import plp.expressions2.memory.VariavelNaoDeclaradaException; 00005 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException; 00006 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException; 00007 import plp.orientadaObjetos1.expressao.Expressao; 00008 import plp.orientadaObjetos1.expressao.leftExpression.AcessoAtributo; 00009 import plp.orientadaObjetos1.expressao.leftExpression.Id; 00010 import plp.orientadaObjetos1.expressao.leftExpression.LeftExpression; 00011 import plp.orientadaObjetos1.expressao.valor.ValorRef; 00012 import plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1; 00013 import plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1; 00014 import plp.orientadaObjetos1.memoria.Objeto; 00015 import plp.orientadaObjetos1.util.TipoClasse; 00019 public class Atribuicao implements Comando { 00023 private LeftExpression av; 00027 private Expressao expressao; 00033 public Atribuicao(LeftExpression av, Expressao expressao){ 00034 this.av = av; 00035 this.expressao = expressao; 00036 } 00037 00047 public AmbienteExecucaoOO1 executar(AmbienteExecucaoOO1 ambiente) 00048 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, 00049 ObjetoNaoDeclaradoException, ClasseNaoDeclaradaException { 00050 00051 Id idVariavel = av.getId(); 00052 if ( av instanceof AcessoAtributo){ 00053 // se for acesso a atributo, tem de alterar o ambiente do objeto! 00054 Expressao expAV = ((AcessoAtributo)av).getExpressaoObjeto(); 00055 ValorRef referencia = (ValorRef)expAV.avaliar(ambiente); 00056 Objeto obj = ambiente.getObjeto(referencia); 00057 AmbienteExecucaoOO1 aux = obj.getEstado(); // recuperando o ambiente do objeto 00058 aux.changeValor(idVariavel, expressao.avaliar(ambiente)); // alterando o ambiente do objeto 00059 } 00060 else 00061 ambiente.changeValor(idVariavel, expressao.avaliar(ambiente)); 00062 return ambiente; 00063 } 00064 00076 public boolean checaTipo(AmbienteCompilacaoOO1 ambiente) 00077 throws VariavelNaoDeclaradaException, ClasseNaoDeclaradaException { 00078 return expressao.checaTipo(ambiente) && 00079 (av.getTipo(ambiente).equals(expressao.getTipo(ambiente)) 00080 || expressao.getTipo(ambiente).equals(TipoClasse.TIPO_NULL)); 00081 } 00082 }