00001 package plp.functional1.expression; 00002 00003 import plp.expressions1.util.Tipo; 00004 import plp.expressions2.expression.Expressao; 00005 import plp.expressions2.expression.Valor; 00006 import plp.expressions2.expression.ValorBooleano; 00007 import plp.expressions2.memory.AmbienteCompilacao; 00008 import plp.expressions2.memory.AmbienteExecucao; 00009 import plp.expressions2.memory.VariavelJaDeclaradaException; 00010 import plp.expressions2.memory.VariavelNaoDeclaradaException; 00011 00012 public class IfThenElse implements Expressao { 00013 00014 private Expressao condicao; 00015 private Expressao then; 00016 private Expressao elseExpressao; 00017 00018 public IfThenElse(Expressao teste, Expressao thenExpressao, 00019 Expressao elseExpressao) { 00020 this.condicao = teste; 00021 this.then = thenExpressao; 00022 this.elseExpressao = elseExpressao; 00023 } 00024 00030 public Expressao getCondicao() { 00031 return condicao; 00032 } 00033 00039 public Expressao getThen() { 00040 return then; 00041 } 00042 00048 public Expressao getElseExpressao() { 00049 return elseExpressao; 00050 } 00051 00052 public Valor avaliar(AmbienteExecucao ambiente) 00053 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00054 if (((ValorBooleano) condicao.avaliar(ambiente)).valor()) 00055 return then.avaliar(ambiente); 00056 else 00057 return elseExpressao.avaliar(ambiente); 00058 } 00059 00073 public boolean checaTipo(AmbienteCompilacao amb) 00074 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00075 boolean ret = condicao.checaTipo(amb); 00076 ret &= then.checaTipo(amb); 00077 ret &= elseExpressao.checaTipo(amb); 00078 00079 Tipo condicaoTipo = condicao.getTipo(amb); 00080 Tipo thenTipo = then.getTipo(amb); 00081 Tipo elseTipo = elseExpressao.getTipo(amb); 00082 00083 return ret && condicaoTipo.eBooleano() && thenTipo.eIgual(elseTipo); 00084 } 00085 00098 public Tipo getTipo(AmbienteCompilacao amb) 00099 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00100 return then.getTipo(amb).intersecao(elseExpressao.getTipo(amb)); 00101 } 00102 00103 @Override 00104 public String toString() { 00105 return String.format("if (%s) then (%s) else (%s)", condicao, then, 00106 elseExpressao); 00107 } 00108 00109 }
1.5.8