00001 package plp.functional1.memory;
00002
00003 import java.util.HashMap;
00004 import java.util.Stack;
00005
00006 import plp.expressions2.expression.Id;
00007 import plp.expressions2.memory.ContextoExecucao;
00008 import plp.expressions2.memory.VariavelJaDeclaradaException;
00009 import plp.expressions2.memory.VariavelNaoDeclaradaException;
00010 import plp.functional1.util.DefFuncao;
00011
00012 public class ContextoExecucaoFuncional extends ContextoExecucao
00013 implements AmbienteExecucaoFuncional {
00014
00018 private Stack<HashMap<Id, DefFuncao>> pilhaFuncao;
00019
00023 public ContextoExecucaoFuncional() {
00024 pilhaFuncao = new Stack<HashMap<Id, DefFuncao>>();
00025 }
00026
00027 public void incrementa() {
00028 super.incrementa();
00029 pilhaFuncao.push(new HashMap<Id, DefFuncao>());
00030 }
00031
00032 public void restaura() {
00033 super.restaura();
00034 pilhaFuncao.pop();
00035 }
00036
00037
00048 public void mapFuncao(Id idArg, DefFuncao funcao)
00049 throws VariavelJaDeclaradaException {
00050 HashMap<Id, DefFuncao> aux = pilhaFuncao.peek();
00051 if (aux.put(idArg, funcao) != null) {
00052 throw new VariavelJaDeclaradaException(idArg);
00053 }
00054 }
00055
00056
00067 public DefFuncao getFuncao(Id idArg) throws VariavelNaoDeclaradaException {
00068 DefFuncao result = null;
00069 Stack<HashMap<Id, DefFuncao>> auxStack =
00070 new Stack<HashMap<Id, DefFuncao>>();
00071 while (result == null && !pilhaFuncao.empty()) {
00072 HashMap<Id, DefFuncao> aux = pilhaFuncao.pop();
00073 auxStack.push(aux);
00074 result = aux.get(idArg);
00075 }
00076 while (!auxStack.empty()) {
00077 pilhaFuncao.push(auxStack.pop());
00078 }
00079 if (result == null) {
00080 throw new VariavelNaoDeclaradaException(idArg);
00081 }
00082
00083 return result;
00084 }
00085
00086 }