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.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 ExpMult extends ExpBinaria {
/**
* Controi uma Expressao de Multiplica��o com as sub-expressoes
* especificadas. Assume-se que estas sub-expressoes resultam em
* ValorInteiro quando avaliadas.
*
* @param esq
* Expressao da esquerda
* @param dir
* Expressao da direita
*/
public ExpMult(Expressao esq, Expressao dir) {
super(esq, dir, "*");
}
/**
* Retorna o valor da Expressao de Multiplica��o
*/
public Valor avaliar(AmbienteExecucao amb)
throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
return new ValorInteiro(((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.
*/
@Override
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.INTEIRO;
}
public ExpMult clone() {
return new ExpMult(this.esq.clone(), this.dir.clone());
}
}