ChamadaProcedimento.java

Go to the documentation of this file.
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         //tem o mesmo numero de parametros formais e reais?
00120         if(listaTipo.length() == parametrosFormais.length()) {
00121             // a funcao tem algum parametro?
00122             if(listaTipo.head() == null || parametrosFormais.getHead() == null) {
00123                 resposta = true;
00124             }
00125             else {
00126                 resposta = true;
00127                 // tem parametros formais de tipos diferentes
00128                 // de parametros reais na ordem em que se apresentam?
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 }

Generated on Tue Sep 12 21:52:05 2006 for PLP by  doxygen 1.4.7