package li1.plp.imperative1.memory; import java.util.HashMap; import java.util.Stack; import li1.plp.expressions2.expression.Id; import li1.plp.expressions2.expression.Valor; import li1.plp.expressions2.memory.ContextoExecucao; import li1.plp.expressions2.memory.VariavelNaoDeclaradaException; public class ContextoExecucaoImperativa extends ContextoExecucao implements AmbienteExecucaoImperativa { /** * A pilha de blocos de contexto. */ private ListaValor entrada; /** * A pilha de blocos de contexto. */ private ListaValor saida; /** * Construtor da classe. */ public ContextoExecucaoImperativa(ListaValor entrada){ super(); this.entrada = entrada; this.saida = new ListaValor(); } public Valor read() throws EntradaVaziaException { if(entrada == null || entrada.getHead() == null) { throw new EntradaVaziaException(); } Valor aux = entrada.getHead(); entrada = (ListaValor) entrada.getTail(); return aux; } public ListaValor getSaida() { return saida; } public void write(Valor v){ saida.write(v); } /** * Altera o valor mapeado do id dado. * * @exception VariavelNaoDeclaradaException se n�o existir nenhum valor * mapeado ao id dado nesta tabela. */ public void changeValor(Id idArg, Valor valorId) throws VariavelNaoDeclaradaException { Object result = null; Stack> auxStack = new Stack>(); Stack> stack = this.getPilha(); while (result == null && !stack.empty()) { HashMap aux = stack.pop(); auxStack.push(aux); result = aux.get(idArg); if (result != null) { aux.put(idArg, valorId); } } while (!auxStack.empty()) { stack.push(auxStack.pop()); } if (result == null) { throw new VariavelNaoDeclaradaException(idArg); } } }