00001 package plp.functional2.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.declaration.DeclaracaoFuncional;
00015 import plp.functional1.util.TipoFuncao;
00016 import plp.functional1.util.TipoPolimorfico;
00017 import plp.functional2.expression.ValorFuncao;
00018
00026 public class DecFuncao implements DeclaracaoFuncional {
00027 private Id id;
00028 private ValorFuncao valorFuncao;
00029
00030 public DecFuncao(Id idFun, ValorFuncao valorFuncao) {
00031 this.id = idFun;
00032 this.valorFuncao = valorFuncao;
00033 }
00034
00040 @Override
00041 public String toString() {
00042 return String.format("fun %s (%s) = %s", id, listToString(valorFuncao
00043 .getListaId(), ","), getExpressao());
00044 }
00045
00046 public Id getId() {
00047 return id;
00048 }
00049
00050 public Expressao getExpressao() {
00051 return valorFuncao.getExp();
00052 }
00053
00054 public ValorFuncao getFuncao() {
00055 return valorFuncao;
00056 }
00057
00063 public int getAridade() {
00064 return valorFuncao.getAridade();
00065 }
00066
00080 public boolean checaTipo(AmbienteCompilacao ambiente)
00081 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
00082 ambiente.incrementa();
00083
00084 List<Tipo> params = new ArrayList<Tipo>(getAridade());
00085 for (int i = 0; i < getAridade(); i++) {
00086 params.add(new TipoPolimorfico());
00087 }
00088 Tipo tipo = new TipoFuncao(params, new TipoPolimorfico());
00089
00090 ambiente.map(id, tipo);
00091
00092 boolean result = valorFuncao.checaTipo(ambiente);
00093 ambiente.restaura();
00094 return result;
00095 }
00096
00112 public Tipo getTipo(AmbienteCompilacao amb)
00113 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
00114 amb.incrementa();
00115
00116 List<Tipo> params = new ArrayList<Tipo>(getAridade());
00117 for (int i = 0; i < getAridade(); i++) {
00118 params.add(new TipoPolimorfico());
00119 }
00120 Tipo tipo = new TipoFuncao(params, new TipoPolimorfico());
00121 amb.map(id, tipo);
00122
00123 Tipo result = valorFuncao.getTipo(amb);
00124 amb.restaura();
00125 return result;
00126 }
00127
00128 }