00001 package plp.functional3.expression; 00002 00003 import plp.expressions1.util.Tipo; 00004 import plp.expressions2.expression.ExpBinaria; 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.TipoLista; 00012 00013 public class ExpCons extends ExpBinaria { 00014 00023 public ExpCons(Expressao esq, Expressao dir) { 00024 super(esq, dir, "cons"); 00025 } 00026 00036 @Override 00037 protected boolean checaTipoElementoTerminal(AmbienteCompilacao amb) 00038 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00039 boolean result = true; 00040 00041 Tipo tipoDir = getDir().getTipo(amb); 00042 00043 if (!tipoDir.eIgual(new TipoLista())) 00044 return false; 00045 00046 Tipo tipoEsq = this.getEsq().getTipo(amb); 00047 if (tipoDir instanceof TipoLista) { 00048 TipoLista tipoListaDir = (TipoLista) tipoDir; 00049 return tipoEsq.eIgual(tipoListaDir.getSubTipo()); 00050 } 00051 00052 return result; 00053 00054 } 00055 00063 public Valor avaliar(AmbienteExecucao amb) 00064 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00065 ValorLista listResult = ((ValorLista) this.getDir().avaliar(amb)) 00066 .clone(); 00067 listResult.cons(this.getEsq().avaliar(amb)); 00068 00069 return listResult; 00070 } 00071 00081 public Tipo getTipo(AmbienteCompilacao amb) 00082 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00083 00084 return this.getDir().getTipo(amb); 00085 } 00086 00087 }
1.5.8