00001 package plp.functional1.util; 00002 00003 import java.util.HashMap; 00004 import java.util.List; 00005 import java.util.Map; 00006 00007 import plp.expressions1.util.Tipo; 00008 import plp.expressions2.expression.Expressao; 00009 import plp.expressions2.expression.Id; 00010 import plp.expressions2.memory.AmbienteCompilacao; 00011 import plp.expressions2.memory.VariavelJaDeclaradaException; 00012 import plp.expressions2.memory.VariavelNaoDeclaradaException; 00013 00014 public class ValorFuncao { 00015 00016 private List<Id> argsId; 00017 00018 private Expressao exp; 00019 00020 public ValorFuncao(List<Id> argsId, Expressao exp) { 00021 this.argsId = argsId; 00022 this.exp = exp; 00023 } 00024 00025 public List<Id> getListaId() { 00026 return argsId; 00027 } 00028 00029 public Expressao getExp() { 00030 return exp; 00031 } 00032 00038 public int getAridade() { 00039 return argsId.size(); 00040 } 00041 00053 public boolean checaTipo(AmbienteCompilacao ambiente) 00054 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00055 ambiente.incrementa(); 00056 Tipo t = getTipo(ambiente); 00057 for (Id id : argsId) { 00058 ambiente.map(id, new Tipo(t.get())); 00059 t = t.getProx(); 00060 } 00061 00062 ambiente.restaura(); 00063 return true; 00064 } 00065 00079 public Tipo getTipo(AmbienteCompilacao ambiente) 00080 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00081 Map<Id, Tipo> mapIdTipo = new HashMap<Id, Tipo>(); 00082 Id[] idsArg = new Id[argsId.size()]; 00083 00084 int i = 0; 00085 for (Id id : argsId) { 00086 mapIdTipo.put(id, new Tipo()); 00087 idsArg[i++] = id; 00088 } 00089 00090 RestrictTypesVisitor.visit(exp, ambiente, mapIdTipo, new Tipo()); 00091 00092 ambiente.incrementa(); 00093 for (Id id : mapIdTipo.keySet()) { 00094 ambiente.map(id, mapIdTipo.get(id)); 00095 } 00096 00097 Tipo result = exp.getTipo(ambiente); 00098 for (i = argsId.size() - 1; i >= 0; i--) { 00099 result = 00100 new Tipo(((Tipo) mapIdTipo.get(idsArg[i])).get(), result); 00101 } 00102 ambiente.restaura(); 00103 return result; 00104 } 00105 }