package li2.plp.imperative1.command; import li2.plp.expressions2.expression.Expressao; import li2.plp.expressions2.expression.ValorBooleano; import li2.plp.expressions2.memory.IdentificadorJaDeclaradoException; import li2.plp.expressions2.memory.IdentificadorNaoDeclaradoException; import li2.plp.imperative1.memory.AmbienteCompilacaoImperativa; import li2.plp.imperative1.memory.AmbienteExecucaoImperativa; import li2.plp.imperative1.memory.EntradaVaziaException; import li2.plp.imperative1.memory.ErroTipoEntradaException; public class IfThenElse implements Comando { private Expressao expressao; private Comando comandoThen; private Comando comandoElse; public IfThenElse(Expressao expressao, Comando comandoThen, Comando comandoElse) { this.expressao = expressao; this.comandoThen = comandoThen; this.comandoElse = comandoElse; } /** * Implementa o comando if then else. * * @param ambiente * o ambiente de execu��o. * * @return o ambiente depois de modificado pela execu��o do comando * if then else. * @throws ErroTipoEntradaException * */ public AmbienteExecucaoImperativa executar( AmbienteExecucaoImperativa ambiente) throws IdentificadorJaDeclaradoException, IdentificadorNaoDeclaradoException, EntradaVaziaException, ErroTipoEntradaException { if (((ValorBooleano) expressao.avaliar(ambiente)).valor()) return comandoThen.executar(ambiente); else return comandoElse.executar(ambiente); } /** * Realiza a verificacao de tipos da express�o e dos comandos do comando * if then else * * @param ambiente * o ambiente de compila��o. * @return true se a express�o e os comando s�o bem tipados; * false caso contrario. */ public boolean checaTipo(AmbienteCompilacaoImperativa ambiente) throws IdentificadorJaDeclaradoException, IdentificadorNaoDeclaradoException, EntradaVaziaException { return expressao.checaTipo(ambiente) && expressao.getTipo(ambiente).eBooleano() && comandoThen.checaTipo(ambiente) && comandoElse.checaTipo(ambiente); } }