Tabla de Atributos

Se empezará viendo cómo se implementa la tabla de atributos.

Esta tabla indica qué información hay que añadir a los nodos del árbol. Hay dos situaciones:

Atributo en Nodo

Supóngase la siguiente tabla de atributos en la que se añade un atributo a un nodo (no categoría sintáctica).

SímboloAtributoTipo
nodovalint

Una forma de implementar un atributo de una gramática atribuida es mediante un atributo del lenguaje de programación.

class Nodo ... {

    public int val;
    ...
}

Sin embargo, cuando en las gramáticas se usa el término atributo, no se está refiriendo a un atributo de una clase. La coincidencia de nombres es accidental. Un atributo de una gramática se puede trasladar a código de más maneras (por ejemplo, como paso de parámetros o valor de retorno). De hecho, la forma en la que se recomienda implementar un atributo de una gramática atribuida es mediante una propiedad.

class Nodo ... {

    private int val;

    public int getVal() {
        return val;
    }

    public int setVal(int val) {
        this.val = val.
    }
    ...
}

Nota

📌 Aunque, como se acaba de indicar, lo recomendable es implementar los atributos como propiedades y acceder a su valor mediante set y get, posteriormente se verán ejemplos en los que, sólo por simplificar los mismos, se accede directamente a atributos públicos.

Atributo en Categoría Sintáctica

Supóngase la siguiente tabla de atributos en la que se añade un atributo a una categoría sintáctica.

SímboloAtributoTipo
exprxint

Dado que las categorías sintácticas se implementan como interfaces, no se puede añadir la implementación de los métodos get y set del atributo como en el apartado anterior. En lugar de ello, se ponen la signatura de los métodos en el interfaz y la implementación en una clase abstracta de la que derivarán las clases de todos los nodos de dicha categoría sintáctica.

interface Expr ... {
    int getX();
    void setX(int x);
}
abstract class AbstractExpr implements Expr {
    private int x;

    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
}