Main Page | Packages | Class Hierarchy | Class List | Directories | File List | Class Members | Related Pages

Atribuicao.java

Go to the documentation of this file.
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 }

Generated on Mon Aug 8 20:20:46 2005 for Linguagem OO1 - Generics by  doxygen 1.4.4