00001 package plp.orientadaObjetos1.comando; 00002 00003 import plp.orientadaObjetos1.excecao.comando.TryCatchException; 00004 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException; 00005 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException; 00006 import plp.orientadaObjetos1.excecao.declaracao.VariavelJaDeclaradaException; 00007 import plp.orientadaObjetos1.excecao.declaracao.VariavelNaoDeclaradaException; 00008 import plp.orientadaObjetos1.expressao.Expressao; 00009 import plp.orientadaObjetos1.expressao.leftExpression.AcessoAtributo; 00010 import plp.orientadaObjetos1.expressao.leftExpression.Id; 00011 import plp.orientadaObjetos1.expressao.leftExpression.LeftExpression; 00012 import plp.orientadaObjetos1.expressao.valor.ValorRef; 00013 import plp.orientadaObjetos1.memoria.AmbienteCompilacao; 00014 import plp.orientadaObjetos1.memoria.AmbienteExecucao; 00015 import plp.orientadaObjetos1.memoria.Objeto; 00016 import plp.orientadaObjetos1.util.TipoClasse; 00020 public class Atribuicao implements Comando { 00024 private LeftExpression av; 00028 private Expressao expressao; 00034 public Atribuicao(LeftExpression av, Expressao expressao){ 00035 this.av = av; 00036 this.expressao = expressao; 00037 } 00038 00047 public AmbienteExecucao executar(AmbienteExecucao ambiente) 00048 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, 00049 ObjetoNaoDeclaradoException, TryCatchException { 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 AmbienteExecucao 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(AmbienteCompilacao ambiente) 00077 throws VariavelNaoDeclaradaException, ClasseNaoDeclaradaException { 00078 boolean checa = expressao.checaTipo(ambiente); 00079 checa = checa && av.getTipo(ambiente).equals(expressao.getTipo(ambiente)); 00080 checa = checa || expressao.getTipo(ambiente).equals(TipoClasse.TIPO_NULL); 00081 return checa; 00082 } 00083 }