00001 package plp.orientadaObjetos1.expressao.leftExpression; 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.valor.Valor; 00009 import plp.orientadaObjetos1.expressao.valor.ValorRef; 00010 import plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1; 00011 import plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1; 00012 import plp.orientadaObjetos1.memoria.DefClasse; 00013 import plp.orientadaObjetos1.memoria.Objeto; 00014 import plp.orientadaObjetos1.util.Tipo; 00015 import plp.orientadaObjetos1.util.TipoClasse; 00016 00020 public class AcessoAtributoId extends AcessoAtributo{ 00024 private LeftExpression av; 00030 public AcessoAtributoId(LeftExpression av, Id id){ 00031 super(id); 00032 this.av = av; 00033 } 00043 public Valor avaliar(AmbienteExecucaoOO1 ambiente) 00044 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, 00045 ObjetoNaoDeclaradoException, ClasseNaoDeclaradaException{ 00046 return obterValorDeIdNoAmbiente(ambiente); 00047 } 00052 public Expressao getExpressaoObjeto(){ 00053 return av; 00054 } 00065 public boolean checaTipo(AmbienteCompilacaoOO1 ambiente) 00066 throws VariavelNaoDeclaradaException, ClasseNaoDeclaradaException{ 00067 boolean resposta = false; 00068 if(av.checaTipo(ambiente)) { 00069 try{ 00070 Tipo t = av.getTipo(ambiente); 00071 DefClasse defClasse = ambiente.getDefClasse(((TipoClasse)t).getTipo()); 00072 defClasse.getTipoAtributo(super.getId()); 00073 resposta = true; 00074 } 00075 catch(VariavelNaoDeclaradaException atrib){ 00076 resposta = false; 00077 } 00078 catch(ClasseNaoDeclaradaException clas){ 00079 resposta = false; 00080 } 00081 00082 } 00083 return resposta; 00084 } 00092 public Tipo getTipo(AmbienteCompilacaoOO1 ambiente) 00093 throws VariavelNaoDeclaradaException, ClasseNaoDeclaradaException{ 00094 //Logo abaixo obtenho a definicao da Classe (seus métodos e atributos). 00095 //av.getTipo devera retornar uma instancia de TipoClasse e assim, TipoClasse.getTipo() 00096 //retorna o id (contendo o nome da classe) associado ao tipo dela 00097 Id nomeClasse = ((TipoClasse)av.getTipo(ambiente)).getTipo(); 00098 DefClasse defClasse = ambiente.getDefClasse(nomeClasse); 00099 Tipo tipoAtr = defClasse.getTipoAtributo(super.getId()); 00100 //Em seguida retorno o tipo do atributo, caso ele esteja definido na classe. 00101 //caso não esteja, uma exceção será lançada 00102 return tipoAtr; 00103 } 00108 public LeftExpression getAv() { 00109 return av; 00110 } 00111 00118 private Valor obterValorDeIdNoAmbiente(AmbienteExecucaoOO1 ambiente) 00119 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, 00120 ObjetoNaoDeclaradoException, ClasseNaoDeclaradaException { 00121 // Pegando o objeto no ambiente 00122 ValorRef referencia = (ValorRef) av.avaliar(ambiente); 00123 Objeto objeto = ambiente.getObjeto(referencia); 00124 // Recuperando o mapeamento de valores do objeto (atributos do objeto) 00125 AmbienteExecucaoOO1 aux = objeto.getEstado(); 00126 // Recuperando o valor do atributo "id" do objeto 00127 return aux.get(super.getId()); 00128 } 00129 }