package loo2.plp.orientadaObjetos2;
import loo2.plp.expressions2.memory.VariavelJaDeclaradaException;
import loo2.plp.expressions2.memory.VariavelNaoDeclaradaException;
import loo2.plp.orientadaObjetos1.comando.Comando;
import loo2.plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException;
import loo2.plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
import loo2.plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException;
import loo2.plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
import loo2.plp.orientadaObjetos1.excecao.declaracao.ProcedimentoJaDeclaradoException;
import loo2.plp.orientadaObjetos1.excecao.declaracao.ProcedimentoNaoDeclaradoException;
import loo2.plp.orientadaObjetos1.excecao.execucao.EntradaInvalidaException;
import loo2.plp.orientadaObjetos1.excecao.execucao.EntradaNaoFornecidaException;
import loo2.plp.orientadaObjetos1.memoria.colecao.ListaValor;
import loo2.plp.orientadaObjetos2.declaracao.ConstrutorNaoDeclaradoException;
import loo2.plp.orientadaObjetos2.declaracao.ListaDeclaracaoOO;
import loo2.plp.orientadaObjetos2.memoria.AmbienteCompilacaoOO2;
import loo2.plp.orientadaObjetos2.memoria.AmbienteExecucaoOO2;
/**
* Classe que representa um programa na linguagem OO.
*/
public class Programa {
/**
* lista de declaracoes OO
*/
private ListaDeclaracaoOO declaracoesOO;
/**
* Comando executado pos a declaracao 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(ListaDeclaracaoOO dec, Comando comando){
this.declaracoesOO = dec;
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.
* @throws ConstrutorNaoDeclaradoException
*
*/
public ListaValor executar(AmbienteExecucaoOO2 ambiente)
throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException,
ObjetoNaoDeclaradoException, ObjetoJaDeclaradoException,
ProcedimentoJaDeclaradoException,ProcedimentoNaoDeclaradoException,
ClasseJaDeclaradaException, ClasseNaoDeclaradaException,
EntradaNaoFornecidaException, EntradaInvalidaException, ConstrutorNaoDeclaradoException {
if(ambiente == null)
throw new EntradaNaoFornecidaException();
ambiente.incrementa();
ambiente = (AmbienteExecucaoOO2) comando.executar(declaracoesOO.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.
* @throws ConstrutorNaoDeclaradoException
*
*/
public boolean checaTipo(AmbienteCompilacaoOO2 ambiente)
throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException,
ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException,
ClasseJaDeclaradaException, ClasseNaoDeclaradaException,
EntradaNaoFornecidaException, ConstrutorNaoDeclaradoException{
boolean resposta;
if(ambiente == null) {
throw new EntradaNaoFornecidaException();
}
ambiente.incrementa();
resposta = declaracoesOO.checaTipo((AmbienteCompilacaoOO2) ambiente) && comando.checaTipo(ambiente);
ambiente.restaura();
return resposta;
}
}