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.functional1.util.TipoPolimorfico; 00012 import plp.functional3.util.ListaVaziaException; 00013 import plp.functional3.util.TipoLista; 00014 00015 public class ExpHead extends ExpUnaria { 00016 00023 public ExpHead(Expressao exp) { 00024 super(exp, "head"); 00025 } 00026 00036 @Override 00037 protected boolean checaTipoElementoTerminal(AmbienteCompilacao amb) 00038 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00039 Tipo tipoExp = getExp().getTipo(amb); 00040 return tipoExp.eIgual(new TipoLista()); 00041 } 00042 00051 public Valor avaliar(AmbienteExecucao amb) 00052 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00053 00054 ValorLista lista = (ValorLista) this.getExp().avaliar(amb); 00055 if (lista.isEmpty()) 00056 throw new ListaVaziaException(); 00057 00058 return (Valor) lista.getHead(); 00059 } 00060 00069 public Tipo getTipo(AmbienteCompilacao amb) 00070 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00071 00072 Tipo tipoExp = this.getExp().getTipo(amb); 00073 if (tipoExp instanceof TipoPolimorfico) 00074 tipoExp = ((TipoPolimorfico) tipoExp).getTipoInstanciado(); 00075 00076 if (tipoExp instanceof TipoLista) 00077 return ((TipoLista) tipoExp).getSubTipo(); 00078 00079 return tipoExp; 00080 } 00081 00082 }
1.5.8