00001 package plp.functional3.expression; 00002 00003 import plp.expressions1.util.Tipo; 00004 import plp.expressions1.util.TipoPrimitivo; 00005 import plp.expressions2.expression.ExpBinaria; 00006 import plp.expressions2.expression.Expressao; 00007 import plp.expressions2.expression.Valor; 00008 import plp.expressions2.expression.ValorInteiro; 00009 import plp.expressions2.memory.AmbienteCompilacao; 00010 import plp.expressions2.memory.AmbienteExecucao; 00011 import plp.expressions2.memory.VariavelJaDeclaradaException; 00012 import plp.expressions2.memory.VariavelNaoDeclaradaException; 00013 import plp.functional3.util.TipoLista; 00014 00015 public class ExpSequencia extends ExpBinaria { 00016 00017 public ExpSequencia(Expressao inicio, Expressao fim) { 00018 super(inicio, fim, ".."); 00019 } 00020 00021 @Override 00022 protected boolean checaTipoElementoTerminal(AmbienteCompilacao amb) 00023 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00024 return getEsq().getTipo(amb).eInteiro() 00025 && getDir().getTipo(amb).eInteiro(); 00026 } 00027 00028 public Valor avaliar(AmbienteExecucao amb) 00029 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00030 00031 ValorInteiro esq = (ValorInteiro) getEsq().avaliar(amb); 00032 ValorInteiro dir = (ValorInteiro) getDir().avaliar(amb); 00033 00034 ValorLista retorno = ValorLista.getInstancia(null, null); 00035 00036 int fim = dir.valor(); 00037 int inicio = esq.valor(); 00038 int incremento = inicio < fim ? 1 : -1; 00039 if (inicio < fim) { 00040 for (int i = fim; i >= inicio; i -= incremento) { 00041 retorno.cons(new ValorInteiro(i)); 00042 } 00043 } else { 00044 for (int i = fim; i <= inicio; i -= incremento) { 00045 retorno.cons(new ValorInteiro(i)); 00046 } 00047 } 00048 00049 return retorno; 00050 } 00051 00052 public Tipo getTipo(AmbienteCompilacao amb) 00053 throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { 00054 return new TipoLista(TipoPrimitivo.INTEIRO); 00055 } 00056 00057 @Override 00058 public String toString() { 00059 return String.format("[%s]", super.toString()); 00060 } 00061 00062 }
1.5.8