00001 package plp.orientadaObjetos1.comando;
00002
00003 import plp.orientadaObjetos1.excecao.comando.TryCatchException;
00004 import plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException;
00005 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
00006 import plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException;
00007 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
00008 import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoJaDeclaradoException;
00009 import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoNaoDeclaradoException;
00010 import plp.orientadaObjetos1.excecao.declaracao.VariavelJaDeclaradaException;
00011 import plp.orientadaObjetos1.excecao.declaracao.VariavelNaoDeclaradaException;
00012 import plp.orientadaObjetos1.excecao.execucao.EntradaInvalidaException;
00013 import plp.orientadaObjetos1.expressao.leftExpression.Id;
00014 import plp.orientadaObjetos1.expressao.valor.Valor;
00015 import plp.orientadaObjetos1.expressao.valor.ValorString;
00016 import plp.orientadaObjetos1.memoria.AmbienteCompilacao;
00017 import plp.orientadaObjetos1.memoria.AmbienteExecucao;
00018 import plp.orientadaObjetos1.util.Tipo;
00019 import plp.orientadaObjetos1.util.TipoPrimitivo;
00020
00024 public class TryCatch implements Comando{
00025
00029 private Comando comandoTry;
00030
00034 private Comando comandoCatch;
00035
00036 private Id mensagem;
00037
00041 public TryCatch(Comando comandoTry, Comando comandoCatch, Id id){
00042 this.comandoTry = comandoTry;
00043 this.comandoCatch = comandoCatch;
00044 this.mensagem = id;
00045 }
00046
00053 public AmbienteExecucao executar(AmbienteExecucao ambiente)
00054 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException,
00055 ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException,
00056 ObjetoJaDeclaradoException, ObjetoNaoDeclaradoException,
00057 ClasseJaDeclaradaException, ClasseNaoDeclaradaException, EntradaInvalidaException, TryCatchException{
00058
00059 try {
00060
00061 ambiente.incrementa();
00062 ambiente = comandoTry.executar(ambiente);
00063
00064 } catch (TryCatchException e) {
00065
00066
00067 ambiente.restaura();
00068
00069
00070 ambiente.incrementa();
00071 ambiente.mapValor(this.mensagem.getId(), new ValorString(e.getMessage()));
00072 ambiente = comandoCatch.executar(ambiente);
00073 }
00074 finally {
00075 ambiente.restaura();
00076 }
00077 return ambiente;
00078 }
00079
00087 public boolean checaTipo(AmbienteCompilacao ambiente)
00088 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException,
00089 ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException,
00090 ClasseNaoDeclaradaException, ClasseJaDeclaradaException {
00091
00092 boolean validaTry = this.comandoTry.checaTipo( ambiente);
00093
00094 ambiente.incrementa();
00095 ambiente.mapTipo(this.mensagem.getId(), TipoPrimitivo.TIPO_STRING);
00096 boolean validaCatch = this.comandoCatch.checaTipo( ambiente);
00097 ambiente.restaura();
00098
00099 return validaTry && validaCatch;
00100 }
00101
00102 }