00001 package plp.orientadaObjetos1.comando;
00002
00003 import plp.expressions2.memory.VariavelJaDeclaradaException;
00004 import plp.expressions2.memory.VariavelNaoDeclaradaException;
00005 import plp.orientadaObjetos1.declaracao.procedimento.ListaDeclaracaoParametro;
00006 import plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException;
00007 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
00008 import plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException;
00009 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
00010 import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoJaDeclaradoException;
00011 import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoNaoDeclaradoException;
00012 import plp.orientadaObjetos1.excecao.execucao.EntradaInvalidaException;
00013 import plp.orientadaObjetos1.expressao.ListaExpressao;
00014 import plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1;
00015 import plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1;
00016 import plp.orientadaObjetos1.memoria.colecao.ListaValor;
00017 import plp.orientadaObjetos1.util.ListaTipo;
00018
00022 public class ChamadaProcedimento implements Comando {
00023
00027 private Procedimento procedimento;
00028
00032 private ListaExpressao parametrosReais;
00033
00037 private ListaValor valoresParametros;
00038
00045 public ChamadaProcedimento(Procedimento procedimento, ListaExpressao parametrosReais,
00046 ListaValor valoresParametros){
00047 this.procedimento = procedimento;
00048 this.parametrosReais = parametrosReais;
00049 this.valoresParametros = valoresParametros;
00050 }
00051
00057 public ChamadaProcedimento(Procedimento procedimento, ListaExpressao parametrosReais){
00058 this.procedimento = procedimento;
00059 this.parametrosReais = parametrosReais;
00060 this.valoresParametros = null;
00061 }
00068 public AmbienteExecucaoOO1 executar(AmbienteExecucaoOO1 ambiente)
00069 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException,
00070 ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException,
00071 ObjetoNaoDeclaradoException, ObjetoJaDeclaradoException,
00072 ClasseNaoDeclaradaException, ClasseJaDeclaradaException, EntradaInvalidaException{
00073
00074 ambiente.incrementa();
00075 ambiente = bindParameters( ambiente, procedimento.getParametrosFormais());
00076 ambiente = procedimento.getComando().executar(ambiente);
00077 ambiente.restaura();
00078 return ambiente;
00079 }
00080
00086 private AmbienteExecucaoOO1 bindParameters (AmbienteExecucaoOO1 ambiente, ListaDeclaracaoParametro parametrosFormais)
00087 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException,
00088 ObjetoNaoDeclaradoException, ClasseNaoDeclaradaException{
00089 ListaValor listaValor = this.valoresParametros;
00090 if(listaValor == null) {
00091 listaValor = parametrosReais.avaliar(ambiente);
00092 }
00093 while (listaValor.length() > 0){
00094 ambiente.map(parametrosFormais.getHead().getId(), listaValor.getHead());
00095 parametrosFormais = ((ListaDeclaracaoParametro) parametrosFormais.getTail());
00096 listaValor = (ListaValor)listaValor.getTail();
00097 }
00098 return ambiente;
00099 }
00100
00112 public boolean checaTipo(AmbienteCompilacaoOO1 ambiente)
00113 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException,
00114 ProcedimentoNaoDeclaradoException,ClasseNaoDeclaradaException {
00115 boolean resposta;
00116 ambiente.incrementa();
00117 ListaDeclaracaoParametro parametrosFormais = procedimento.getParametrosFormais();
00118 ListaTipo listaTipo = parametrosReais.getTipos(ambiente);
00119
00120 if(listaTipo.length() == parametrosFormais.length()) {
00121
00122 if(listaTipo.head() == null || parametrosFormais.getHead() == null) {
00123 resposta = true;
00124 }
00125 else {
00126 resposta = true;
00127
00128
00129 while(listaTipo != null && parametrosFormais != null) {
00130 if( ! listaTipo.head().equals(parametrosFormais.getHead().getTipo())) {
00131 resposta = false;
00132 break;
00133 }
00134 listaTipo = listaTipo.tail();
00135 parametrosFormais = ((ListaDeclaracaoParametro) parametrosFormais.getTail());
00136 }
00137 }
00138 }
00139 else {
00140 resposta = false;
00141 }
00142 ambiente.restaura();
00143 return resposta;
00144 }
00145 }