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.ValorInteiro; 00010 import plp.orientadaObjetos1.memoria.AmbienteCompilacao; 00011 import plp.orientadaObjetos1.memoria.AmbienteExecucao; 00012 import plp.orientadaObjetos1.util.Tipo; 00013 import plp.orientadaObjetos1.util.TipoPrimitivo; 00014 00018 public class ExpSoma extends ExpBinaria { 00019 00027 public ExpSoma(Expressao esq, Expressao dir) { 00028 super(esq, dir, "+"); 00029 } 00030 00034 public Valor avaliar(AmbienteExecucao ambiente) 00035 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, 00036 ObjetoNaoDeclaradoException { 00037 return obterResultadoDaSoma(ambiente); 00038 } 00039 00051 public boolean checaTipo(AmbienteCompilacao ambiente) 00052 throws VariavelNaoDeclaradaException, ClasseNaoDeclaradaException { 00053 boolean result; 00054 if (super.checaTipo(ambiente) && 00055 ((TipoPrimitivo)getEsq().getTipo(ambiente)).eInteiro() && 00056 ((TipoPrimitivo)getDir().getTipo(ambiente)).eInteiro()) { 00057 result = true; 00058 } 00059 else { 00060 result = false; 00061 } 00062 return result; 00063 } 00064 00071 public Tipo getTipo(AmbienteCompilacao ambiente) { 00072 return TipoPrimitivo.TIPO_INTEIRO; 00073 } 00074 00080 private ValorInteiro obterResultadoDaSoma(AmbienteExecucao ambiente) 00081 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, 00082 ObjetoNaoDeclaradoException{ 00083 return new ValorInteiro( 00084 ((ValorInteiro) getEsq().avaliar(ambiente)).valor() + 00085 ((ValorInteiro) getDir().avaliar(ambiente)).valor() ); 00086 } 00087 }