00001 package plp.orientadaObjetos1.declaracao.variavel; 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.ObjetoJaDeclaradoException; 00007 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException; 00008 import plp.orientadaObjetos1.expressao.Expressao; 00009 import plp.orientadaObjetos1.expressao.leftExpression.Id; 00010 import plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1; 00011 import plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1; 00012 import plp.orientadaObjetos1.util.Tipo; 00013 import plp.orientadaObjetos1.util.TipoClasse; 00014 00018 public class SimplesDecVariavel implements DecVariavel{ 00022 private Tipo tipo; 00026 private Id id; 00030 private Expressao expressao; 00037 public SimplesDecVariavel(Tipo tipo, Id id, Expressao expressao){ 00038 this.tipo = tipo; 00039 this.id = id; 00040 this.expressao = expressao; 00041 } 00042 00048 public Tipo getTipo(Id id) throws VariavelNaoDeclaradaException{ 00049 if(this.id.equals(id)){ 00050 return tipo; 00051 } 00052 else { 00053 throw new VariavelNaoDeclaradaException(id); 00054 } 00055 } 00056 00066 public AmbienteExecucaoOO1 elabora(AmbienteExecucaoOO1 ambiente) 00067 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, 00068 ObjetoNaoDeclaradoException,ObjetoJaDeclaradoException, ClasseNaoDeclaradaException { 00069 ambiente.map(id , expressao.avaliar(ambiente)); 00070 return ambiente; 00071 } 00072 00081 public boolean checaTipo(AmbienteCompilacaoOO1 ambiente) 00082 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, 00083 ClasseNaoDeclaradaException { 00084 boolean resposta = false; 00085 if ( expressao.checaTipo(ambiente) ) { 00086 if( tipo instanceof TipoClasse) { 00087 resposta = expressao.getTipo(ambiente).equals(TipoClasse.TIPO_NULL) || 00088 expressao.getTipo(ambiente).equals(tipo); 00089 } 00090 else { 00091 resposta = expressao.getTipo(ambiente).equals(tipo); 00092 } 00093 } 00094 if(resposta) { 00095 ambiente.map(id, tipo); 00096 } 00097 return resposta; 00098 } 00099 }