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