00001 package plp.orientadaObjetos1.expressao.binaria; 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.ValorBooleano; 00010 import plp.orientadaObjetos1.expressao.valor.ValorConcreto; 00011 import plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1; 00012 import plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1; 00013 import plp.orientadaObjetos1.util.Tipo; 00014 import plp.orientadaObjetos1.util.TipoClasse; 00015 import plp.orientadaObjetos1.util.TipoPrimitivo; 00016 00017 00022 public class ExpEquals extends ExpBinaria{ 00023 00031 public ExpEquals(Expressao esq, Expressao dir){ 00032 super(esq, dir, "=="); 00033 } 00034 00038 public Valor avaliar(AmbienteExecucaoOO1 ambiente) 00039 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, 00040 ObjetoNaoDeclaradoException, ClasseNaoDeclaradaException { 00041 return verificarIgualdade(ambiente); 00042 } 00043 00055 public boolean checaTipo(AmbienteCompilacaoOO1 ambiente) 00056 throws VariavelNaoDeclaradaException, ClasseNaoDeclaradaException { 00057 boolean result = false; 00058 if (super.checaTipo(ambiente)) { 00059 if(getEsq().getTipo(ambiente) instanceof TipoClasse) { 00060 result = getDir().getTipo(ambiente).equals(TipoClasse.TIPO_NULL) || 00061 getEsq().getTipo(ambiente).equals(getDir().getTipo(ambiente)); 00062 } 00063 else { 00064 result = getEsq().getTipo(ambiente).equals(getDir().getTipo(ambiente)); 00065 } 00066 } 00067 return result; 00068 } 00069 00076 public Tipo getTipo(AmbienteCompilacaoOO1 ambiente) { 00077 return TipoPrimitivo.TIPO_BOOLEANO; 00078 } 00079 00087 private ValorBooleano verificarIgualdade(AmbienteExecucaoOO1 ambiente) 00088 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, 00089 ObjetoNaoDeclaradoException, ClasseNaoDeclaradaException{ 00090 Valor v1 = getEsq().avaliar(ambiente); 00091 Valor v2 = getDir().avaliar(ambiente); 00092 boolean compara; 00093 if (v1 instanceof ValorConcreto && v2 instanceof ValorConcreto){ 00094 compara = ((ValorConcreto)v1).equals((ValorConcreto)(v2)); 00095 } else { 00096 compara = v1.equals(v2); 00097 } 00098 return new ValorBooleano(compara); 00099 } 00100 }