package tirateima.controlador; import java.util.List; import java.util.Stack; /** * Modela um comando de atribuição. * * @author Luciano Santos */ public class CommandAttribution extends Command { private Stack<Object> var_stack; private Stack<Object> pilhaSimbolos; public CommandAttribution(Stack<Object> var_stack, Stack<Object> pilhaSimbolos) { this.var_stack = var_stack; this.pilhaSimbolos = pilhaSimbolos; } /** * Executa o comando de atribuição setando o valor da variável (respeitado * seu escopo). */ public void execute(Controlador c) throws TiraTeimaLanguageException { Stack<Object> pilhaAuxiliar = new Stack<Object>(); recuperaValoresVariaveis(pilhaAuxiliar, c); Object value = AvaliadorDeExpressao.avaliar(pilhaAuxiliar); setValue(c.mostrador, var_stack, value); } @Override public void revert(Controlador c) throws TiraTeimaLanguageException, ExecutionException { // TODO Auto-generated method stub } /** * Recupera os valores das variáveis colocando no lugar da pilha em que estava * a variável o seu valor corrente para cálculo. * * @param pilhaSimbolos */ @SuppressWarnings("unchecked") private void recuperaValoresVariaveis(Stack<Object> pilhaAuxiliar,Controlador c) { Stack<Object> pilhaIntermediaria = new Stack<Object>(); //passa os elementos para uma pilha intermediária while(!pilhaSimbolos.empty()){ pilhaIntermediaria.push(pilhaSimbolos.pop()); } /*pega cada elemento e coloca na pilha auxiliar, e devolve-o à pilha de * símbolos original.*/ while(!pilhaIntermediaria.empty()){ Object elemento = pilhaIntermediaria.pop(); if(elemento instanceof List){ pilhaAuxiliar.push(getValue(c, (List<Object>)elemento)); } else{ pilhaAuxiliar.push(elemento); } pilhaSimbolos.push(elemento); } } }