package li1.plp.imperative1.declaration;
import li1.plp.expressions2.expression.Expressao;
import li1.plp.expressions2.expression.Id;
import li1.plp.expressions2.memory.IdentificadorJaDeclaradoException;
import li1.plp.expressions2.memory.IdentificadorNaoDeclaradoException;
import li1.plp.imperative1.memory.AmbienteCompilacaoImperativa;
import li1.plp.imperative1.memory.AmbienteExecucaoImperativa;
public class DeclaracaoVariavel extends Declaracao {
private Id id;
private Expressao expressao;
public DeclaracaoVariavel(Id id, Expressao expressao) {
super();
this.id = id;
this.expressao = expressao;
}
/**
* Cria um mapeamento do identificador para o valor da express�o desta
* declara��o no AmbienteExecucao
*
* @param ambiente
* o ambiente que contem o mapeamento entre identificadores e
* valores.
*
* @return o ambiente modificado pela inicializa��o da vari�vel.
*/
@Override
public AmbienteExecucaoImperativa elabora(
AmbienteExecucaoImperativa ambiente)
throws IdentificadorJaDeclaradoException,
IdentificadorNaoDeclaradoException {
ambiente.map(getId(), getExpressao().avaliar(ambiente));
return ambiente;
}
public Expressao getExpressao() {
return this.expressao;
}
public Id getId() {
return this.id;
}
/**
* Verifica se a declara��o est� bem tipada, ou seja, se a express�o de
* inicializa��o est� bem tipada, e cria o mapeamento da variavel para o seu
* tipo correspondente
*
* @param ambiente
* o ambiente que contem o mapeamento entre identificadores e
* seus tipos.
*
* @return true se os tipos da declara��o s�o v�lidos;
* false caso contrario.
*
*/
@Override
public boolean checaTipo(AmbienteCompilacaoImperativa ambiente)
throws IdentificadorJaDeclaradoException,
IdentificadorNaoDeclaradoException {
boolean result = getExpressao().checaTipo(ambiente);
if (result) {
ambiente.map(getId(), getExpressao().getTipo(ambiente));
}
return result;
}
}