package loo1.plp.orientadaObjetos1.comando;
import loo1.plp.expressions2.memory.VariavelJaDeclaradaException;
import loo1.plp.expressions2.memory.VariavelNaoDeclaradaException;
import loo1.plp.orientadaObjetos1.excecao.execucao.EntradaInvalidaException;
import loo1.plp.orientadaObjetos1.expressao.leftExpression.Id;
import loo1.plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1;
import loo1.plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1;
import loo1.plp.orientadaObjetos1.util.Tipo;
/**
* Representa um comando de leitura.
*/
public class Read implements IO{
/**
* O identificador ao qual ser� atribu�do o valor lido.
*/
private Id id;
/**
* O tipo do identificador cujo novo valor ser� lido.
*/
private Tipo tipoId;
/**
* Construtor.
* @param id O identificador ao qual ser� a atribu�do o valor lido.
*/
public Read ( Id id){
this.id = id;
}
/**
* L� da entrada padr�o.
* @param ambiente o ambiente de execu��o.
* @return o ambiente depois de modificado pela execu��o
* do comando read.
*
*/
public AmbienteExecucaoOO1 executar(AmbienteExecucaoOO1 ambiente)
throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, EntradaInvalidaException {
ambiente.changeValor(id, ambiente.read(this.tipoId));
return ambiente;
}
/**
* Realiza a verificacao de tipos da entrada
* @param ambiente o ambiente de compila��o.
* @return true se a express�o da entrada est� bem tipada;
* false caso contrario.
*/
public boolean checaTipo(AmbienteCompilacaoOO1 ambiente)
throws VariavelNaoDeclaradaException {
// Alteramos a implementa��o, pois em tempo de compila��o n�o se pode saber
// o tipo da entrada que ser� lida.
// Tipo tipo = ambiente.getTipoEntrada();
// Tipo tipo2 = id.getTipo(ambiente);
this.tipoId = id.getTipo(ambiente);
return id.checaTipo(ambiente);
//return id.getTipo(ambiente).equals(ambiente.getTipoEntrada());
}
}