00001 package plp.functional3.expression; 00002 00003 import plp.expressions1.util.Tipo; 00004 import plp.expressions2.expression.ExpUnaria; 00005 import plp.expressions2.expression.Expressao; 00006 import plp.expressions2.expression.Valor; 00007 import plp.expressions2.memory.AmbienteCompilacao; 00008 import plp.expressions2.memory.AmbienteExecucao; 00009 import plp.expressions2.memory.VariavelJaDeclaradaException; 00010 import plp.expressions2.memory.VariavelNaoDeclaradaException; 00011 import plp.functional3.util.ListaVaziaException; 00012 import plp.functional3.util.TipoLista; 00013 00014 public class ExpTail extends ExpUnaria { 00015 00020 public ExpTail(Expressao exp) { 00021 super(exp, "tail"); 00022 } 00023 00030 protected boolean checaTipoElementoTerminal(AmbienteCompilacao amb) 00031 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00032 Tipo tipoExp = getExp().getTipo(amb); 00033 return tipoExp.eIgual(new TipoLista()); 00034 } 00035 00041 public Valor avaliar(AmbienteExecucao amb) 00042 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00043 00044 ValorLista lista = (ValorLista) this.getExp().avaliar(amb); 00045 00046 // Tail de uma lista vazia não existe é como se fosse uma divisão por zero 00047 if (lista.isEmpty()) { 00048 throw new ListaVaziaException(); 00049 } 00050 00051 ValorLista tail = lista.getTail(); 00052 00053 // Se o tail for nulo (lista de apenas um elemento) 00054 // retornamos uma lista vazia pois tail([x]) = [] 00055 if (tail == null) 00056 { 00057 tail = ValorLista.getInstancia(null, null); 00058 } 00059 00060 return tail; 00061 } 00062 00068 public Tipo getTipo(AmbienteCompilacao amb) 00069 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00070 return this.getExp().getTipo(amb); 00071 } 00072 00073 }
1.5.8