00001 package plp.orientadaObjetos1.declaracao.variavel; 00002 00003 import plp.orientadaObjetos1.excecao.comando.TryCatchException; 00004 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException; 00005 import plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException; 00006 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException; 00007 import plp.orientadaObjetos1.excecao.declaracao.VariavelJaDeclaradaException; 00008 import plp.orientadaObjetos1.excecao.declaracao.VariavelNaoDeclaradaException; 00009 import plp.orientadaObjetos1.expressao.Expressao; 00010 import plp.orientadaObjetos1.expressao.leftExpression.Id; 00011 import plp.orientadaObjetos1.memoria.AmbienteCompilacao; 00012 import plp.orientadaObjetos1.memoria.AmbienteExecucao; 00013 import plp.orientadaObjetos1.util.Tipo; 00014 import plp.orientadaObjetos1.util.TipoClasse; 00015 00019 public class DecVariavelSimples implements DecVariavel{ 00023 private Tipo tipo; 00027 private Id id; 00031 private Expressao expressao; 00038 public DecVariavelSimples(Tipo tipo, Id id, Expressao expressao){ 00039 this.tipo = tipo; 00040 this.id = id; 00041 this.expressao = expressao; 00042 } 00043 00049 public Tipo getTipo(Id id) throws VariavelNaoDeclaradaException{ 00050 if(this.id.equals(id)){ 00051 return tipo; 00052 } 00053 else { 00054 throw new VariavelNaoDeclaradaException(id); 00055 } 00056 } 00057 00066 public AmbienteExecucao executar(AmbienteExecucao ambiente) 00067 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, 00068 ObjetoNaoDeclaradoException,ObjetoJaDeclaradoException, TryCatchException { 00069 ambiente.mapValor(id , expressao.avaliar(ambiente)); 00070 return ambiente; 00071 } 00072 00081 public boolean checaTipo(AmbienteCompilacao 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.mapTipo(id, tipo); 00096 } 00097 return resposta; 00098 } 00099 }