package lf1.plp.expressions2.expression; import lf1.plp.expressions2.memory.AmbienteCompilacao; import lf1.plp.expressions2.memory.AmbienteExecucao; import lf1.plp.expressions2.memory.VariavelJaDeclaradaException; import lf1.plp.expressions2.memory.VariavelNaoDeclaradaException; /** * Uma expressao unaria contem uma expressao e um operador sobre a mesma. */ public abstract class ExpUnaria implements Expressao { /** * Expressao contida pela expressao unaria */ protected Expressao exp; /** * Representacao do operador desta expressao unaria. */ private String operador; /** * Construtor da classe. * * @param exp * expressao contida pela expressao unaria. */ public ExpUnaria(Expressao exp, String operador) { this.exp = exp; this.operador = operador; } /** * Retorna a expressao contida pela expressao unaria * * @return a expressao contida pela expressao unaria */ public Expressao getExp() { return exp; } /** * Retorna a representacao do operador desta expressao unaria. * * @return a representacao do operador desta expressao unaria. */ public String getOperador() { return operador; } /** * Realiza a verificacao de tipos desta expressao. * * @param amb * o ambiente de compila��o. * @return true se o tipo da subexpressao é valido; * false caso contrario. * @exception VariavelJaDeclaradaException * se a vari�vel j� est� declarada no ambiente * @exception VariavelNaoDeclaradaException * se a vari�vel ainda n�o foi declarada no ambiente. */ public boolean checaTipo(AmbienteCompilacao amb) throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException { return getExp().checaTipo(amb) && this.checaTipoElementoTerminal(amb); } @Override public String toString() { return String.format("%s %s", operador, exp); } /** * M�todo 'template' que ser� implementado nas subclasses para checar o tipo * do head terminal */ protected abstract boolean checaTipoElementoTerminal(AmbienteCompilacao amb) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException; public Expressao reduzir(AmbienteExecucao ambiente) { this.exp = this.exp.reduzir(ambiente); return this; } public abstract ExpUnaria clone(); }