00001 package plp.functional2.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.declaration.DeclaracaoFuncional; 00012 import plp.functional2.expression.ValorFuncao; 00013 00022 public class DecFuncao implements DeclaracaoFuncional { 00023 private Id id; 00024 private ValorFuncao valorFuncao; 00025 00026 public DecFuncao(Id idFun, ValorFuncao valorFuncao) { 00027 this.id = idFun; 00028 this.valorFuncao = valorFuncao; 00029 } 00030 00036 public String toString() { 00037 StringBuffer sb = new StringBuffer(); 00038 sb.append("fun "); 00039 sb.append(id.toString()); 00040 sb.append(" ("); 00041 List<Id> listaId = valorFuncao.getListaId(); 00042 if (listaId != null) { 00043 for(Id id:listaId){ 00044 sb.append(id.toString()); 00045 sb.append(", "); 00046 } 00047 } 00048 sb.append(") = "); 00049 sb.append(valorFuncao.getExp().toString()); 00050 return sb.toString(); 00051 } 00052 00053 public Id getID() { 00054 return id; 00055 } 00056 00057 public Expressao getExpressao() { 00058 return valorFuncao.getExp(); 00059 } 00060 00061 public ValorFuncao getFuncao() { 00062 return valorFuncao; 00063 } 00064 00070 public int getAridade() { 00071 return valorFuncao.getAridade(); 00072 } 00073 00085 public boolean checaTipo(AmbienteCompilacao ambiente) 00086 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00087 ambiente.incrementa(); 00088 Tipo tipo = new Tipo(); 00089 for (int i = getAridade() - 1; i >= 0; i--) { 00090 tipo = new Tipo(tipo); 00091 } 00092 ambiente.map(id, tipo); 00093 boolean result = valorFuncao.checaTipo(ambiente); 00094 ambiente.restaura(); 00095 return result; 00096 } 00097 00111 public Tipo getTipo(AmbienteCompilacao amb) 00112 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00113 amb.incrementa(); 00114 Tipo tipo = new Tipo(); 00115 for (int i = getAridade() - 1; i >= 0; i--) { 00116 tipo = new Tipo(tipo); 00117 } 00118 amb.map(id, tipo); 00119 Tipo result = valorFuncao.getTipo(amb); 00120 amb.restaura(); 00121 return result; 00122 } 00123 }