00001 package plp.expressions2.memory;
00002
00003 import java.util.HashMap;
00004 import java.util.Stack;
00005
00006 import plp.expressions2.expression.Id;
00007
00014 public class Contexto<T> {
00018 private Stack<HashMap<Id, T>> pilha;
00019
00023 public Contexto() {
00024 pilha = new Stack<HashMap<Id, T>>();
00025 }
00026
00027 public void incrementa() {
00028 pilha.push(new HashMap<Id, T>());
00029 }
00030
00031 public void restaura() {
00032 pilha.pop();
00033 }
00034
00041 public void map(Id idArg, T valorId) throws VariavelJaDeclaradaException {
00042 try {
00043 HashMap<Id, T> aux = pilha.peek();
00044 if (aux.put(idArg, valorId) != null)
00045 throw new IdentificadorJaDeclaradoException();
00046 } catch (IdentificadorJaDeclaradoException e) {
00047 throw new VariavelJaDeclaradaException(idArg);
00048 }
00049 }
00050
00058 public T get(Id idArg) throws VariavelNaoDeclaradaException {
00059 try {
00060 T result = null;
00061 Stack<HashMap<Id, T>> auxStack = new Stack<HashMap<Id, T>>();
00062 while (result == null && !pilha.empty()) {
00063 HashMap<Id, T> aux = pilha.pop();
00064 auxStack.push(aux);
00065 result = aux.get(idArg);
00066 }
00067 while (!auxStack.empty()) {
00068 pilha.push(auxStack.pop());
00069 }
00070 if (result == null)
00071 throw new IdentificadorNaoDeclaradoException();
00072
00073 return result;
00074 } catch (IdentificadorNaoDeclaradoException e) {
00075 throw new VariavelNaoDeclaradaException(idArg);
00076 }
00077 }
00078
00084 protected Stack<HashMap<Id, T>> getPilha() {
00085 return pilha;
00086 }
00087
00094 protected void setPilha(Stack<HashMap<Id, T>> pilha) {
00095 this.pilha = pilha;
00096 }
00097
00098 }