Ejemplo 650

Objetivo

Este ejercicio es un ejemplo de implementación en Java de una gramática atribuida.

Enunciado

Implementar en Java la siguiente tabla de reglas de una gramática abstracta.

GLCPredicadosFunciones
programa ⟶ exprexpr.terminal = FALSE
litEnt ⟶ lexema:stringlitEnt.prioridad = 3
suma ⟶ left:expr right:exprsuma.terminal == FALSEleft.terminal = FALSE
right.terminal = TRUE
suma.prioridad = 1
mult ⟶ left:expr right:exprmult.terminal == FALSE
left.prioridad ≥ 2
left.terminal = FALSE
right.terminal = TRUE
mult.prioridad = 2

Solución

Esta gramática es L-atribuida, por lo que se puede aplicar el patrón postorden obteniendo la siguiente implementación:


class Ejemplo650 implements Visitor {

    ...

    public void visit(Programa prog) {
        prog.expr.setTerminal(false);
        prog.expr.accept(this);
    }

    public void visit(LitEnt lit) {
        lit.setPrioridad(3);
    }

    public void visit(Suma suma) {
        suma.left.setTerminal(false);
        suma.left.accept(this);

        suma.right.setTerminal(true);
        suma.right.accept(this);

        predicado(suma.getTerminal() == false);
        suma.setPrioridad(1);
    }

    public void visit(Multiplicación mult) {
        mult.left.setTerminal(false);
        mult.left.accept(this);

        mult.right.setTerminal(true);
        mult.right.accept(this);

        predicado(mult.getTerminal() == false);
        predicado(mult.left.getPrioridad() >= 2);
        mult.setPrioridad(2);
    }
}