00001 package plp.functional1.declaration;
00002
00003 import static plp.expressions1.util.ToStringProvider.listToString;
00004
00005 import java.util.ArrayList;
00006 import java.util.List;
00007
00008 import plp.expressions1.util.Tipo;
00009 import plp.expressions2.expression.Expressao;
00010 import plp.expressions2.expression.Id;
00011 import plp.expressions2.memory.AmbienteCompilacao;
00012 import plp.expressions2.memory.VariavelJaDeclaradaException;
00013 import plp.expressions2.memory.VariavelNaoDeclaradaException;
00014 import plp.functional1.util.DefFuncao;
00015 import plp.functional1.util.TipoFuncao;
00016 import plp.functional1.util.TipoPolimorfico;
00017
00018 public class DecFuncao implements DeclaracaoFuncional {
00019
00020 private Id id;
00021
00022 private DefFuncao funcao;
00023
00024 public DecFuncao(Id idFun, List<Id> argsId, Expressao exp) {
00025 this.id = idFun;
00026 this.funcao = new DefFuncao(argsId, exp);
00027 }
00028
00029 public Id getId() {
00030 return id;
00031 }
00032
00033 public List<Id> getListaId() {
00034 return funcao.getListaId();
00035 }
00036
00037 public Expressao getExpressao() {
00038 return funcao.getExp();
00039 }
00040
00046 public int getAridade() {
00047 return funcao.getAridade();
00048 }
00049
00050 public DefFuncao getFuncao() {
00051 return funcao;
00052 }
00053
00059 @Override
00060 public String toString() {
00061 return String.format("fun %s (%s) = %s", id, listToString(funcao
00062 .getListaId(), ","), funcao.getExp());
00063 }
00064
00078 public boolean checaTipo(AmbienteCompilacao ambiente)
00079 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
00080 ambiente.incrementa();
00081
00082 List<Tipo> params = new ArrayList<Tipo>(getAridade());
00083 for (int i = 0; i < getAridade(); i++) {
00084 params.add(new TipoPolimorfico());
00085 }
00086 Tipo tipo = new TipoFuncao(params, new TipoPolimorfico());
00087
00088 ambiente.map(id, tipo);
00089
00090 boolean result = funcao.checaTipo(ambiente);
00091 ambiente.restaura();
00092 return result;
00093 }
00094
00110 public Tipo getTipo(AmbienteCompilacao amb)
00111 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
00112 amb.incrementa();
00113
00114 List<Tipo> params = new ArrayList<Tipo>(getAridade());
00115 for (int i = 0; i < getAridade(); i++) {
00116 params.add(new TipoPolimorfico());
00117 }
00118 Tipo tipo = new TipoFuncao(params, new TipoPolimorfico());
00119 amb.map(id, tipo);
00120
00121 Tipo result = funcao.getTipo(amb);
00122 amb.restaura();
00123 return result;
00124 }
00125
00126 }