package li1.plp.imperative1.command;
import li1.plp.expressions2.expression.Expressao;
import li1.plp.expressions2.expression.ValorBooleano;
import li1.plp.imperative1.memory.AmbienteExecucaoImperativa;
import li1.plp.imperative1.memory.AmbienteCompilacaoImperativa;
import li1.plp.imperative1.memory.EntradaVaziaException;
import li1.plp.imperative1.memory.ErroTipoEntradaException;
import li1.plp.expressions2.memory.IdentificadorJaDeclaradoException;
import li1.plp.expressions2.memory.IdentificadorNaoDeclaradoException;
public class While implements Comando {
private Expressao expressao;
private Comando comando;
public While(Expressao expressao, Comando comando) {
this.expressao = expressao;
this.comando = comando;
}
/**
* Implementa o comando while.
*
* @param ambiente
* o ambiente de execu��o.
*
* @return o ambiente depois de modificado pela execu��o do comando
* while.
* @throws ErroTipoEntradaException
*
*/
public AmbienteExecucaoImperativa executar(
AmbienteExecucaoImperativa ambiente)
throws IdentificadorJaDeclaradoException,
IdentificadorNaoDeclaradoException, EntradaVaziaException, ErroTipoEntradaException {
while (((ValorBooleano) expressao.avaliar(ambiente)).valor()) {
ambiente = comando.executar(ambiente);
}
return ambiente;
}
/**
* Realiza a verificacao de tipos da express�o e dos comandos do comando
* while
*
* @param ambiente
* o ambiente de compila��o.
* @return true se 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()
&& comando.checaTipo(ambiente);
}
}