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);
}
}