package loo1.plp.orientadaObjetos1; import loo1.plp.expressions2.memory.VariavelJaDeclaradaException; import loo1.plp.expressions2.memory.VariavelNaoDeclaradaException; import loo1.plp.orientadaObjetos1.comando.Comando; import loo1.plp.orientadaObjetos1.declaracao.classe.DecClasse; 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.excecao.execucao.EntradaNaoFornecidaException; import loo1.plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1; import loo1.plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1; import loo1.plp.orientadaObjetos1.memoria.colecao.ListaValor; /** * Classe que representa um programa na linguagem OO. */ public class Programa { /** * Declara�ao de classe */ private DecClasse decClasse; /** * Comando executado ap�s a declara�ao de classes */ private Comando comando; /** * Construtor. * @param decClasse A declara�ao de classe(s) * @param comando O comando executado ap�s a declara�ao. */ public Programa(DecClasse decClasse, Comando comando){ this.decClasse = decClasse; this.comando = comando; } /** * Executa o programa. * * @param ambiente o ambiente de execu��o. * * @return o ambiente depois de modificado pela execu��o * do programa. * * @exception EntradaNaoFornecidaException se n�o for fornecida * a tail de valores de entrada do programa. * */ public ListaValor executar(AmbienteExecucaoOO1 ambiente) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, ObjetoNaoDeclaradoException, ObjetoJaDeclaradoException, ProcedimentoJaDeclaradoException,ProcedimentoNaoDeclaradoException, ClasseJaDeclaradaException, ClasseNaoDeclaradaException, EntradaNaoFornecidaException, EntradaInvalidaException { if(ambiente == null) throw new EntradaNaoFornecidaException(); //nao precisa incrementar no inicio, j� que n�o existe a possibilidade //de declarar vari�veis antes de uma declara��o de classes //ambiente.incrementa(); ambiente = comando.executar(decClasse.elabora(ambiente)); //ambiente.restaura(); return ambiente.getSaida(); } /** * Realiza a verificacao de tipos do programa * * @param ambiente o ambiente de compila��o. * @return true se o programa est� bem tipado; * false caso contrario. * * @exception EntradaNaoFornecidaException se n�o for fornecida * a tail de valores de entrada do programa. * */ public boolean checaTipo(AmbienteCompilacaoOO1 ambiente) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException, ClasseJaDeclaradaException, ClasseNaoDeclaradaException, EntradaNaoFornecidaException{ boolean resposta; if(ambiente == null) { throw new EntradaNaoFornecidaException(); } //nao precisa incrementar no inicio, j� que n�o existe a possibilidade //de declarar vari�veis antes de uma declara��o de classes //ambiente.incrementa(); resposta = decClasse.checaTipo(ambiente) && comando.checaTipo(ambiente); //ambiente.restaura(); return resposta; } }