package li2.plp.imperative1.command; import li2.plp.expressions2.expression.Expressao; import li2.plp.expressions2.expression.Id; import li2.plp.expressions2.memory.VariavelJaDeclaradaException; import li2.plp.expressions2.memory.VariavelNaoDeclaradaException; import li2.plp.imperative1.memory.AmbienteCompilacaoImperativa; import li2.plp.imperative1.memory.AmbienteExecucaoImperativa; public class Atribuicao implements Comando { private Id id; private Expressao expressao; public Atribuicao(Id id, Expressao expressao) { this.id = id; this.expressao = expressao; } /** * Executa a atribui��o. * * @param ambiente * o ambiente que contem o mapeamento entre identificadores e * valores. * * @return o ambiente modificado pela execu��o da atribui��o. * */ public AmbienteExecucaoImperativa executar( AmbienteExecucaoImperativa ambiente) throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException { ambiente.changeValor(id, expressao.avaliar(ambiente)); return ambiente; } /** * Um comando de atribui��o est� bem tipado, se o tipo do identificador � o * mesmo da express�o. O tipo de um identificador � determinado pelo tipo da * express�o que o inicializou (na declara��o). * * @param ambiente * o ambiente que contem o mapeamento entre identificadores e * valores. * * @return true se os tipos da atribui��o s�o v�lidos; * false caso contrario. * */ public boolean checaTipo(AmbienteCompilacaoImperativa ambiente) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { return expressao.checaTipo(ambiente) && id.getTipo(ambiente).eIgual(expressao.getTipo(ambiente)); } }