ValorFuncao.java

Go to the documentation of this file.
00001 package plp.functional1.util;
00002 
00003 import java.util.HashMap;
00004 import java.util.List;
00005 import java.util.Map;
00006 
00007 import plp.expressions1.util.Tipo;
00008 import plp.expressions2.expression.Expressao;
00009 import plp.expressions2.expression.Id;
00010 import plp.expressions2.memory.AmbienteCompilacao;
00011 import plp.expressions2.memory.VariavelJaDeclaradaException;
00012 import plp.expressions2.memory.VariavelNaoDeclaradaException;
00013 
00014 public class ValorFuncao {
00015 
00016         private List<Id> argsId;
00017 
00018         private Expressao exp;
00019 
00020         public ValorFuncao(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 
00053         public boolean checaTipo(AmbienteCompilacao ambiente)
00054                 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
00055                 ambiente.incrementa();
00056                 Tipo t = getTipo(ambiente);
00057                 for (Id id : argsId) {
00058                         ambiente.map(id, new Tipo(t.get()));
00059                         t = t.getProx();
00060                 }
00061 
00062                 ambiente.restaura();
00063                 return true;
00064         }
00065 
00079         public Tipo getTipo(AmbienteCompilacao ambiente)
00080                 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
00081                 Map<Id, Tipo> mapIdTipo = new HashMap<Id, Tipo>();
00082                 Id[] idsArg = new Id[argsId.size()];
00083 
00084                 int i = 0;
00085                 for (Id id : argsId) {
00086                         mapIdTipo.put(id, new Tipo());
00087                         idsArg[i++] = id;
00088                 }
00089 
00090                 RestrictTypesVisitor.visit(exp, ambiente, mapIdTipo, new Tipo());
00091 
00092                 ambiente.incrementa();
00093                 for (Id id : mapIdTipo.keySet()) {
00094                         ambiente.map(id, mapIdTipo.get(id));
00095                 }
00096 
00097                 Tipo result = exp.getTipo(ambiente);
00098                 for (i = argsId.size() - 1; i >= 0; i--) {
00099                         result =
00100                                 new Tipo(((Tipo) mapIdTipo.get(idsArg[i])).get(), result);
00101                 }
00102                 ambiente.restaura();
00103                 return result;
00104         }
00105 }

Generated on Tue Sep 12 21:52:03 2006 for PLP by  doxygen 1.4.7