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 Expressao condicao; 00014 Expressao then; 00015 Expressao elseExpressao; 00016 00017 public IfThenElse( 00018 Expressao teste, 00019 Expressao thenExpressao, 00020 Expressao elseExpressao) { 00021 this.condicao = teste; 00022 this.then = thenExpressao; 00023 this.elseExpressao = elseExpressao; 00024 } 00025 00026 public Valor avaliar(AmbienteExecucao ambiente) 00027 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00028 if (((ValorBooleano) condicao.avaliar(ambiente)).valor()) 00029 return then.avaliar(ambiente); 00030 else 00031 return elseExpressao.avaliar(ambiente); 00032 } 00033 00037 public String toString() { 00038 StringBuffer sb = new StringBuffer(); 00039 sb.append("if ("); 00040 sb.append(condicao.toString()); 00041 sb.append(") then ("); 00042 sb.append(then.toString()); 00043 sb.append(") else ("); 00044 sb.append(elseExpressao.toString()); 00045 sb.append(")"); 00046 return sb.toString(); 00047 } 00048 00060 public boolean checaTipo(AmbienteCompilacao amb) 00061 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00062 boolean result = true; 00063 if (!condicao.getTipo(amb).eBooleano()) { 00064 result = false; 00065 } else if ( 00066 then.getTipo(amb).intersecao(elseExpressao.getTipo(amb)).eVoid()) { 00067 result = false; 00068 } 00069 return result; 00070 } 00071 00082 public Tipo getTipo(AmbienteCompilacao amb) 00083 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00084 return then.getTipo(amb).intersecao(elseExpressao.getTipo(amb)); 00085 } 00086 00091 public Expressao getCondicao() { 00092 return condicao; 00093 } 00094 00099 public Expressao getThen() { 00100 return then; 00101 } 00102 00107 public Expressao getElseExpressao() { 00108 return elseExpressao; 00109 } 00110 00111 }