00001 package plp.orientadaObjetos1.comando; 00002 00003 import plp.orientadaObjetos1.excecao.comando.TryCatchException; 00004 import plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException; 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.excecao.declaracao.ProcedimentoJaDeclaradoException; 00009 import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoNaoDeclaradoException; 00010 import plp.orientadaObjetos1.excecao.declaracao.VariavelJaDeclaradaException; 00011 import plp.orientadaObjetos1.excecao.declaracao.VariavelNaoDeclaradaException; 00012 import plp.orientadaObjetos1.excecao.execucao.EntradaInvalidaException; 00013 import plp.orientadaObjetos1.expressao.Expressao; 00014 import plp.orientadaObjetos1.expressao.valor.ValorBooleano; 00015 import plp.orientadaObjetos1.memoria.AmbienteCompilacao; 00016 import plp.orientadaObjetos1.memoria.AmbienteExecucao; 00017 import plp.orientadaObjetos1.util.TipoPrimitivo; 00018 00022 public class IfThenElse implements Comando { 00026 private Expressao expressao; 00030 private Comando comandoThen; 00034 private Comando comandoElse; 00041 public IfThenElse (Expressao expressao, Comando comandoThen, Comando comandoElse){ 00042 this.expressao = expressao; 00043 this.comandoThen = comandoThen; 00044 this.comandoElse = comandoElse; 00045 } 00046 00053 public AmbienteExecucao executar(AmbienteExecucao ambiente) 00054 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, 00055 ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException, 00056 ClasseJaDeclaradaException, ClasseNaoDeclaradaException, 00057 ObjetoJaDeclaradoException, ObjetoNaoDeclaradoException, EntradaInvalidaException, TryCatchException { 00058 ambiente.incrementa(); 00059 boolean condicao = ((ValorBooleano)expressao.avaliar(ambiente)).valor(); 00060 if ( condicao) { 00061 ambiente = comandoThen.executar(ambiente); 00062 } 00063 else { 00064 ambiente = comandoElse.executar(ambiente); 00065 } 00066 ambiente.restaura(); 00067 return ambiente; 00068 } 00069 00077 public boolean checaTipo(AmbienteCompilacao ambiente) 00078 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, 00079 ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException, 00080 ClasseJaDeclaradaException, ClasseNaoDeclaradaException { 00081 boolean checa = expressao.checaTipo(ambiente); 00082 checa = checa && ((TipoPrimitivo)expressao.getTipo(ambiente)).eBooleano(); 00083 checa = checa && comandoThen.checaTipo(ambiente); 00084 checa = checa && comandoElse.checaTipo(ambiente); 00085 00086 00087 return checa; 00088 } 00089 00090 }