00001 package plp.functional1.util;
00002
00003 import java.util.ArrayList;
00004 import java.util.List;
00005
00006 import plp.expressions1.util.Tipo;
00007 import plp.expressions2.expression.Expressao;
00008 import plp.expressions2.expression.Id;
00009 import plp.expressions2.memory.AmbienteCompilacao;
00010 import plp.expressions2.memory.VariavelJaDeclaradaException;
00011 import plp.expressions2.memory.VariavelNaoDeclaradaException;
00012 import plp.functional3.expression.VarargsId;
00013
00014 public class DefFuncao {
00015
00016 private List<Id> argsId;
00017
00018 private Expressao exp;
00019
00020 public DefFuncao(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
00055 public boolean checaTipo(AmbienteCompilacao ambiente)
00056 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
00057 ambiente.incrementa();
00058
00059
00060
00061 for (Id id : argsId) {
00062 ambiente.map(id, new TipoPolimorfico());
00063 }
00064
00065
00066
00067 boolean result = exp.checaTipo(ambiente);
00068
00069 ambiente.restaura();
00070
00071 return result;
00072 }
00073
00089 public Tipo getTipo(AmbienteCompilacao ambiente)
00090 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
00091 ambiente.incrementa();
00092
00093 for (Id id : argsId) {
00094 ambiente.map(id, new TipoPolimorfico());
00095 }
00096
00097
00098
00099
00100
00101 exp.checaTipo(ambiente);
00102
00103
00104 Tipo result = exp.getTipo(ambiente);
00105
00106
00107 List<Tipo> params = new ArrayList<Tipo>(getAridade());
00108 Tipo argTipo;
00109 for (int i = 0; i < getAridade(); i++) {
00110 argTipo = ((TipoPolimorfico) ambiente.get(argsId.get(i))).inferir();
00111 params.add(argTipo);
00112 }
00113 result = new TipoFuncao(params, result);
00114
00115 ambiente.restaura();
00116
00117 return result;
00118 }
00119 }