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.
GLC | Predicados | Funciones |
---|---|---|
programa ⟶ expr | expr.terminal = FALSE | |
litEnt ⟶ lexema:string | litEnt.prioridad = 3 | |
suma ⟶ left:expr right:expr | suma.terminal == FALSE | left.terminal = FALSE right.terminal = TRUE suma.prioridad = 1 |
mult ⟶ left:expr right:expr | mult.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);
}
}