package loo2.plp.orientadaObjetos1.comando;
import loo2.plp.expressions2.memory.VariavelJaDeclaradaException;
import loo2.plp.expressions2.memory.VariavelNaoDeclaradaException;
import loo2.plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException;
import loo2.plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
import loo2.plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException;
import loo2.plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
import loo2.plp.orientadaObjetos1.excecao.declaracao.ProcedimentoJaDeclaradoException;
import loo2.plp.orientadaObjetos1.excecao.declaracao.ProcedimentoNaoDeclaradoException;
import loo2.plp.orientadaObjetos1.excecao.execucao.EntradaInvalidaException;
import loo2.plp.orientadaObjetos1.expressao.Expressao;
import loo2.plp.orientadaObjetos1.expressao.valor.ValorBooleano;
import loo2.plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1;
import loo2.plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1;
import loo2.plp.orientadaObjetos1.util.TipoPrimitivo;
/**
* Classe que representa um comando While.
*/
public class While implements Comando{
/**
* Express�o booleana a ser avaliada.
*/
private Expressao expressao;
/**
* Comando que ser� executado caso a express�o seja avaliada como verdadeira.
*/
private Comando comando;
/**
* Construtor.
* @param expressao A express�o booleana a ser avaliada.
* @param o comando a ser executado caso a express�o seja verdadeira.
*/
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.
*/
public AmbienteExecucaoOO1 executar(AmbienteExecucaoOO1 ambiente)
throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException,
ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException,
ObjetoJaDeclaradoException, ObjetoNaoDeclaradoException,
ClasseJaDeclaradaException, ClasseNaoDeclaradaException, EntradaInvalidaException{
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(AmbienteCompilacaoOO1 ambiente)
throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException,
ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException,
ClasseNaoDeclaradaException, ClasseJaDeclaradaException {
return expressao.checaTipo(ambiente) &&
((TipoPrimitivo)expressao.getTipo(ambiente)).eBooleano() &&
comando.checaTipo(ambiente);
}
}