package lf3.plp.functional3.expression;
import lf3.plp.expressions1.util.Tipo;
import lf3.plp.expressions1.util.TipoPrimitivo;
import lf3.plp.expressions2.expression.ExpBinaria;
import lf3.plp.expressions2.expression.Expressao;
import lf3.plp.expressions2.expression.Valor;
import lf3.plp.expressions2.expression.ValorBooleano;
import lf3.plp.expressions2.expression.ValorInteiro;
import lf3.plp.expressions2.memory.AmbienteCompilacao;
import lf3.plp.expressions2.memory.AmbienteExecucao;
import lf3.plp.expressions2.memory.VariavelJaDeclaradaException;
import lf3.plp.expressions2.memory.VariavelNaoDeclaradaException;
public class ExpMenorQue extends ExpBinaria {
public ExpMenorQue(Expressao esq, Expressao dir) {
super(esq, dir, "<");
}
/**
* Retorna o valor da Expressao de Soma
*/
public Valor avaliar(AmbienteExecucao amb) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
return new ValorBooleano(
((ValorInteiro) getEsq().avaliar(amb)).valor() <
((ValorInteiro) getDir().avaliar(amb)).valor() );
}
/**
* Realiza a verificacao de tipos desta expressao.
*
* @param ambiente o ambiente de compila��o.
* @return true se os tipos da expressao sao validos;
* false caso contrario.
* @exception VariavelNaoDeclaradaException se existir um identificador
* nao declarado no ambiente.
* @exception VariavelNaoDeclaradaException se existir um identificador
* declarado mais de uma vez no mesmo bloco do ambiente.
*/
protected boolean checaTipoElementoTerminal(AmbienteCompilacao ambiente)
throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
return (getEsq().getTipo(ambiente).eInteiro() && getDir().getTipo(ambiente).eInteiro());
}
/**
* Retorna os tipos possiveis desta expressao.
*
* @param ambiente o ambiente de compila��o.
* @return os tipos possiveis desta expressao.
*/
public Tipo getTipo(AmbienteCompilacao ambiente) {
return TipoPrimitivo.BOOLEANO;
}
public ExpMenorQue clone() {
return new ExpMenorQue(this.esq.clone(), this.dir.clone());
}
}