package loo1.plp.orientadaObjetos1.declaracao.variavel; import loo1.plp.expressions2.memory.VariavelJaDeclaradaException; import loo1.plp.expressions2.memory.VariavelNaoDeclaradaException; 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.expressao.Expressao; 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; import loo1.plp.orientadaObjetos1.util.TipoClasse; /** * Classe que representa uma declara�ao de vari�vel simples. */ public class SimplesDecVariavel implements DecVariavel{ /** * Tipo da vari�vel declada. */ private Tipo tipo; /** * Vari�vel declarada. */ private Id id; /** * Express�o cujo valor ser� atribu�do � vari�vel. */ private Expressao expressao; /** * Construtor. * @param tipo Tipo da vari�vel declarada. * @param id Vari�vel declarada. * @param expressao Express�o cujo valor ser� atribu�do � vari�vel. */ public SimplesDecVariavel(Tipo tipo, Id id, Expressao expressao){ this.tipo = tipo; this.id = id; this.expressao = expressao; } /** * Retorna o tipo do identificador a ser declarado no AmbienteCompilacao * @param id o identificador da declaracao * @return o tipo do identificador */ public Tipo getTipo(Id id) throws VariavelNaoDeclaradaException{ if(this.id.equals(id)){ return tipo; } else { throw new VariavelNaoDeclaradaException(id); } } /** * 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. * @throws ClasseNaoDeclaradaException * */ public AmbienteExecucaoOO1 elabora(AmbienteExecucaoOO1 ambiente) throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, ObjetoNaoDeclaradoException,ObjetoJaDeclaradoException, ClasseNaoDeclaradaException { ambiente.map(id , expressao.avaliar(ambiente)); return ambiente; } /** * Verifica se a declara��o est� bem tipada, ou seja, se a * express�o de inicializa��o est� bem tipada. * @param ambiente o ambiente que contem o mapeamento entre identificadores * e seus tipos. * @return true se a express�o � bem tipada; * false caso contrario. */ public boolean checaTipo(AmbienteCompilacaoOO1 ambiente) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, ClasseNaoDeclaradaException { boolean resposta = false; if ( expressao.checaTipo(ambiente) ) { if( tipo instanceof TipoClasse) { resposta = expressao.getTipo(ambiente).equals(TipoClasse.TIPO_NULL) || expressao.getTipo(ambiente).equals(tipo); } else { resposta = expressao.getTipo(ambiente).equals(tipo); } } if(resposta) { ambiente.map(id, tipo); } return resposta; } }