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:
- Que se añada un atributo a un nodo.
- Que se añada a una categoría sintáctica.
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ímbolo | Atributo | Tipo |
---|---|---|
nodo | val | int |
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ímbolo | Atributo | Tipo |
---|---|---|
expr | x | int |
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;
}
}