00001 package plp.orientadaObjetos1.expressao.binaria; 00002 00003 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException; 00004 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException; 00005 import plp.orientadaObjetos1.excecao.declaracao.VariavelJaDeclaradaException; 00006 import plp.orientadaObjetos1.excecao.declaracao.VariavelNaoDeclaradaException; 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.AmbienteCompilacao; 00012 import plp.orientadaObjetos1.memoria.AmbienteExecucao; 00013 import plp.orientadaObjetos1.util.Tipo; 00014 import plp.orientadaObjetos1.util.TipoClasse; 00015 import plp.orientadaObjetos1.util.TipoGeneric; 00016 import plp.orientadaObjetos1.util.TipoPrimitivo; 00017 00018 00023 public class ExpEquals extends ExpBinaria{ 00024 00032 public ExpEquals(Expressao esq, Expressao dir){ 00033 super(esq, dir, "=="); 00034 } 00035 00039 public Valor avaliar(AmbienteExecucao ambiente) 00040 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, 00041 ObjetoNaoDeclaradoException { 00042 return verificarIgualdade(ambiente); 00043 } 00044 00056 public boolean checaTipo(AmbienteCompilacao ambiente) 00057 throws VariavelNaoDeclaradaException, ClasseNaoDeclaradaException { 00058 boolean result = false; 00059 if (super.checaTipo(ambiente)) { 00060 Tipo tipoEsq = getEsq().getTipo(ambiente); 00061 if( tipoEsq instanceof TipoClasse || tipoEsq instanceof TipoGeneric) { 00062 result = getDir().getTipo(ambiente).equals(TipoClasse.TIPO_NULL) || 00063 getEsq().getTipo(ambiente).equals(getDir().getTipo(ambiente)); 00064 } 00065 else { 00066 result = getEsq().getTipo(ambiente).equals(getDir().getTipo(ambiente)); 00067 } 00068 } 00069 return result; 00070 } 00071 00078 public Tipo getTipo(AmbienteCompilacao ambiente) { 00079 return TipoPrimitivo.TIPO_BOOLEANO; 00080 } 00081 00088 private ValorBooleano verificarIgualdade(AmbienteExecucao ambiente) 00089 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, 00090 ObjetoNaoDeclaradoException{ 00091 Valor v1 = getEsq().avaliar(ambiente); 00092 Valor v2 = getDir().avaliar(ambiente); 00093 boolean compara; 00094 if (v1 instanceof ValorConcreto && v2 instanceof ValorConcreto){ 00095 compara = ((ValorConcreto)v1).equals((ValorConcreto)(v2)); 00096 } else { 00097 compara = v1.equals(v2); 00098 } 00099 return new ValorBooleano(compara); 00100 } 00101 }