00001 package plp.functional2.expression; 00002 00003 import java.util.List; 00004 00005 import plp.expressions1.util.Tipo; 00006 import plp.expressions2.expression.Expressao; 00007 import plp.expressions2.expression.Id; 00008 import plp.expressions2.expression.Valor; 00009 import plp.expressions2.memory.AmbienteCompilacao; 00010 import plp.expressions2.memory.AmbienteExecucao; 00011 import plp.expressions2.memory.VariavelJaDeclaradaException; 00012 import plp.expressions2.memory.VariavelNaoDeclaradaException; 00013 00022 public class ValorFuncao implements ValorAbstrato { 00023 00024 private List<Id> argsId; 00025 00026 private Expressao exp; 00027 00028 public ValorFuncao(List<Id> argsId, Expressao exp) { 00029 this.argsId = argsId; 00030 this.exp = exp; 00031 } 00032 00033 public List<Id> getListaId() { 00034 return argsId; 00035 } 00036 00037 public Expressao getExp() { 00038 return exp; 00039 } 00040 00046 public int getAridade() { 00047 return argsId.size(); 00048 } 00049 00061 public boolean checaTipo(AmbienteCompilacao ambiente) 00062 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00063 ambiente.incrementa(); 00064 Tipo t = getTipo(ambiente); 00065 00066 for(Id id:this.argsId){ 00067 ambiente.map(id, new Tipo(t.get())); 00068 t = t.getProx(); 00069 } 00070 ambiente.restaura(); 00071 return true; 00072 } 00073 00087 public Tipo getTipo(AmbienteCompilacao ambiente) 00088 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00089 00090 throw new UnsupportedOperationException("As expressoes da Linguagem " + 00091 "funcional 2 nao possuem checagem de tipo implementada"); 00092 } 00093 00094 public Valor avaliar(AmbienteExecucao ambiente) { 00095 return this; 00096 } 00097 00098 public String toString() { 00099 StringBuffer sb = new StringBuffer(); 00100 sb.append("fn "); 00101 00102 List<Id> listaId = getListaId(); 00103 00104 if (listaId != null) { 00105 for (Id id : listaId) { 00106 sb.append(id.toString() + " "); 00107 } 00108 } 00109 sb.append(". "); 00110 sb.append(exp.toString()); 00111 return sb.toString(); 00112 } 00113 00114 }