00001 package plp.functional1.declaration; 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.memory.AmbienteCompilacao; 00009 import plp.expressions2.memory.VariavelJaDeclaradaException; 00010 import plp.expressions2.memory.VariavelNaoDeclaradaException; 00011 import plp.functional1.util.ValorFuncao; 00012 00013 public class DecFuncao implements DeclaracaoFuncional { 00014 private Id id; 00015 private ValorFuncao valorFuncao; 00016 00017 public DecFuncao(Id idFun, ValorFuncao valorFuncao) { 00018 this.id = idFun; 00019 this.valorFuncao = valorFuncao; 00020 } 00021 00022 //Mudar o for do iterator para o novo for. 00028 public String toString() { 00029 StringBuffer sb = new StringBuffer(); 00030 sb.append("fun "); 00031 sb.append(id.toString()); 00032 sb.append(" ("); 00033 List<Id> listaId = valorFuncao.getListaId(); 00034 if (listaId != null) { 00035 for(Id id:listaId){ 00036 sb.append(id.toString()); 00037 sb.append(", "); 00038 } 00039 } 00040 sb.append(") = "); 00041 sb.append(valorFuncao.getExp().toString()); 00042 return sb.toString(); 00043 } 00044 00045 public Id getID() { 00046 return id; 00047 } 00048 00049 public Expressao getExpressao() { 00050 return valorFuncao.getExp(); 00051 } 00052 00053 public ValorFuncao getFuncao() { 00054 return valorFuncao; 00055 } 00056 00062 public int getAridade() { 00063 return valorFuncao.getAridade(); 00064 } 00065 00077 public boolean checaTipo(AmbienteCompilacao ambiente) 00078 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00079 ambiente.incrementa(); 00080 Tipo tipo = new Tipo(); 00081 for (int i = getAridade() - 1; i >= 0; i--) { 00082 tipo = new Tipo(tipo); 00083 } 00084 ambiente.map(id, tipo); 00085 boolean result = valorFuncao.checaTipo(ambiente); 00086 ambiente.restaura(); 00087 return result; 00088 } 00089 00103 public Tipo getTipo(AmbienteCompilacao amb) 00104 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00105 amb.incrementa(); 00106 Tipo tipo = new Tipo(); 00107 for (int i = getAridade() - 1; i >= 0; i--) { 00108 tipo = new Tipo(tipo); 00109 } 00110 amb.map(id, tipo); 00111 Tipo result = valorFuncao.getTipo(amb); 00112 amb.restaura(); 00113 return result; 00114 } 00115 }