Main Page | Packages | Class Hierarchy | Class List | Directories | File List | Class Members | Related Pages

ChamadaProcedimento.java

Go to the documentation of this file.
00001 package plp.orientadaObjetos1.comando;
00002 
00003 import plp.orientadaObjetos1.declaracao.procedimento.ListaDeclaracaoParametro;
00004 import plp.orientadaObjetos1.excecao.comando.TryCatchException;
00005 import plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException;
00006 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
00007 import plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException;
00008 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
00009 import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoJaDeclaradoException;
00010 import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoNaoDeclaradoException;
00011 import plp.orientadaObjetos1.excecao.declaracao.VariavelJaDeclaradaException;
00012 import plp.orientadaObjetos1.excecao.declaracao.VariavelNaoDeclaradaException;
00013 import plp.orientadaObjetos1.excecao.execucao.EntradaInvalidaException;
00014 import plp.orientadaObjetos1.expressao.ListaExpressao;
00015 import plp.orientadaObjetos1.memoria.AmbienteCompilacao;
00016 import plp.orientadaObjetos1.memoria.AmbienteExecucao;
00017 import plp.orientadaObjetos1.memoria.colecao.ListaValor;
00018 import plp.orientadaObjetos1.util.ListaTipo;
00019 import plp.orientadaObjetos1.util.Tipo;
00020 import plp.orientadaObjetos1.util.TipoClasse;
00021 import plp.orientadaObjetos1.util.TipoGeneric;
00022 
00026 public class ChamadaProcedimento implements Comando {
00027 
00031     private Procedimento procedimento;
00032 
00036     private ListaExpressao parametrosReais;
00037 
00041     private ListaValor valoresParametros;
00042 
00049     public ChamadaProcedimento(Procedimento procedimento, ListaExpressao parametrosReais,
00050                                ListaValor valoresParametros){
00051         this.procedimento = procedimento;
00052         this.parametrosReais = parametrosReais;
00053         this.valoresParametros = valoresParametros;
00054     }
00055 
00061     public ChamadaProcedimento(Procedimento procedimento, ListaExpressao parametrosReais){
00062         this.procedimento = procedimento;
00063         this.parametrosReais = parametrosReais;
00064         this.valoresParametros = null;
00065     }
00072     public AmbienteExecucao executar(AmbienteExecucao ambiente)
00073         throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException,
00074                ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException,
00075                ObjetoNaoDeclaradoException, ObjetoJaDeclaradoException,
00076                ClasseNaoDeclaradaException, ClasseJaDeclaradaException, EntradaInvalidaException, TryCatchException{
00077 
00078         ambiente.incrementa();
00079         ambiente = bindParameters( ambiente, procedimento.getParametrosFormais());
00080             ambiente = procedimento.getComando().executar(ambiente);            
00081  
00082             ambiente.restaura();            
00083         return ambiente;
00084     }
00085 
00090     private AmbienteExecucao bindParameters (AmbienteExecucao ambiente, ListaDeclaracaoParametro parametrosFormais)
00091         throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException,
00092                ObjetoNaoDeclaradoException{
00093         ListaValor listaValor = this.valoresParametros;
00094         if(listaValor == null) {
00095             listaValor = parametrosReais.avaliar(ambiente);
00096         }
00097         while (listaValor.length() > 0){
00098             ambiente.mapValor (parametrosFormais.head().getId(), listaValor.head());
00099             parametrosFormais = parametrosFormais.tail();
00100             listaValor = listaValor.tail();
00101         }
00102         return ambiente;
00103     }
00104 
00116      public boolean checaTipo(AmbienteCompilacao ambiente)
00117         throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException,
00118                ProcedimentoNaoDeclaradoException,ClasseNaoDeclaradaException {
00119         boolean resposta;
00120         ambiente.incrementa();
00121         ListaDeclaracaoParametro parametrosFormais = procedimento.getParametrosFormais();
00122         ListaTipo listaTipo = parametrosReais.getTipos(ambiente);
00123         //tem o mesmo numero de parametros formais e reais?
00124         if(listaTipo.length() == parametrosFormais.length()) {
00125             // a funcao tem algum parametro?
00126             if(listaTipo.head() == null || parametrosFormais.head() == null) {
00127                 resposta = true;
00128             }
00129             else {
00130                 resposta = true;
00131                 // tem parametros formais de tipos diferentes
00132                 // de parametros reais na ordem em que se apresentam?
00133                 while(listaTipo != null && parametrosFormais != null) {
00134                     
00135                     //Pegar os parametros do metodo
00136                     Tipo tpf = parametrosFormais.head().getTipo();
00137                     Tipo tpr = listaTipo.head();
00138                     
00139                     //TODO e se for um TipoGenericClasse
00140                     if (tpf instanceof TipoGeneric && tpr instanceof TipoClasse) {
00141                         tpf = ambiente.getTipoReal( tpf);
00142                         tpf = new TipoClasse( (TipoGeneric)tpf);
00143                     }
00144                     
00145                     if( ! tpr.equals( tpf)) {
00146                         resposta = false;
00147                         break;
00148                     }
00149                     listaTipo = listaTipo.tail();
00150                     parametrosFormais = parametrosFormais.tail();
00151                 }
00152             }
00153         }
00154         else {
00155             resposta = false;
00156         }
00157         ambiente.restaura();
00158         return resposta;
00159     }
00160 }

Generated on Mon Aug 8 20:20:46 2005 for Linguagem OO1 - Generics by  doxygen 1.4.4