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
00124 if(listaTipo.length() == parametrosFormais.length()) {
00125
00126 if(listaTipo.head() == null || parametrosFormais.head() == null) {
00127 resposta = true;
00128 }
00129 else {
00130 resposta = true;
00131
00132
00133 while(listaTipo != null && parametrosFormais != null) {
00134
00135
00136 Tipo tpf = parametrosFormais.head().getTipo();
00137 Tipo tpr = listaTipo.head();
00138
00139
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 }