00001 package plp.orientadaObjetos1.expressao.unaria; 00002 00003 import plp.expressions2.memory.VariavelJaDeclaradaException; 00004 import plp.expressions2.memory.VariavelNaoDeclaradaException; 00005 import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException; 00006 import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException; 00007 import plp.orientadaObjetos1.expressao.Expressao; 00008 import plp.orientadaObjetos1.expressao.valor.Valor; 00009 import plp.orientadaObjetos1.expressao.valor.ValorInteiro; 00010 import plp.orientadaObjetos1.expressao.valor.ValorString; 00011 import plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1; 00012 import plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1; 00013 import plp.orientadaObjetos1.util.Tipo; 00014 import plp.orientadaObjetos1.util.TipoPrimitivo; 00015 00016 00020 public class ExpLength extends ExpUnaria { 00021 00029 public ExpLength(Expressao expressao) { 00030 super(expressao, "length"); 00031 } 00032 00043 public Valor avaliar(AmbienteExecucaoOO1 ambiente) 00044 throws VariavelJaDeclaradaException, 00045 VariavelNaoDeclaradaException, ObjetoNaoDeclaradoException, ClasseNaoDeclaradaException { 00046 return obterTamanhoDoString(ambiente); 00047 } 00048 00060 public boolean checaTipo(AmbienteCompilacaoOO1 ambiente) 00061 throws VariavelNaoDeclaradaException, ClasseNaoDeclaradaException { 00062 boolean result; 00063 if (super.checaTipo(ambiente) && 00064 ((TipoPrimitivo)getExp().getTipo(ambiente)).eString()) { 00065 result = true; 00066 } 00067 else { 00068 result = false; 00069 } 00070 return result; 00071 } 00072 00079 public Tipo getTipo(AmbienteCompilacaoOO1 ambiente) { 00080 return TipoPrimitivo.TIPO_INTEIRO; 00081 } 00082 00089 private ValorInteiro obterTamanhoDoString(AmbienteExecucaoOO1 ambiente) 00090 throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, 00091 ObjetoNaoDeclaradoException, ClasseNaoDeclaradaException{ 00092 return new ValorInteiro (((ValorString)getExp().avaliar(ambiente)).valor().length()); 00093 } 00094 }